2016年10月10日月曜日

[iOS]windowsを用いた開発環境構築

[準備するもの]
  • VMWare Player
  • macOS ISO or VMWareイメージファイル
  • unlocker (VMWare PlayerでmacOSを使用できようにする)

[インストール方法]
smc.version = "0"

[キーボード設定]
①vmxファイルに以下を追加し再起動する。
 keyboard.vusb.enable = "TRUE"
 keyboard.vusb.idVendor = "0x0000"
 keyboard.vusb.idProduct = "0x0000"


②キーボード設定アシスタントでJISキーボードを選択

③System環境設定->キーボードで「キーボードの種類を変更」で②と同様の操作を行う


※VMでの使用が認められているのはOS X 10.7 Lion以降です

2016年9月19日月曜日

独自で2Dアニメーションを実装するベストプラクティス

2Dアニメーションを行いたい!

といった場合、Androidにはいくつもの方法が存在します。

  • Animationクラスを使用
  • ObjectAnimatorクラスを使用
  • ViewPropertyAnimatorクラスを使用
  • SurfaceViewクラスを使用


AnimationクラスはAPI Level1からあるレガシーなAPIですが、jniのオーバヘッドが大きく、またAnimationSetで複数のアニメーションを同時実行しようした場合、それぞれが独立して動作するためパフォーマンスが良くありません。Googleはこれを早くdeprecatedにするべきです。

SurfaceViewはViewのレンダリングがHWアクセラレーションに対応してからその存在意義がなくなりました。これもdeprecatedになるべきです。

結果的に今使うべきはObjectAnimatorかViewPropertyAnimatorに絞られるわけですが、標準のAnimatorだけではどうしても実現できない複雑な動きをさせたい場合があります。

そこで使用できるのが以下のAPI。日本語に訳すと振り付け師。

android.view.Choreographer

VSync周期でコールバックしてくれるので、それを受けて自らViewのpropertyを操作すれば好きなようにアニメーションが実装できます。


----------
最後に確認したOSバージョンはAndroid 7.0です

AndroidはGoogle Inc.の商標または登録商標です

2016年9月4日日曜日

ViewのLayer Typeについて

Windowに新規Viewを追加する際に指定するLayerTypeのZ-Order値は?

Activity以外でViewを表示したい場合、WindowManagerに直接addViewする必要がありますが、typeに指定するLayerTypeのLayer Level(Z-Order値)はドキュメントには記載されてません。

以下のソースを見ればわかります。

PhoneWindowManager#windowTypeToLayerLw


ちなみに以下のLAYERはAndroid 6.0よりAppOp権限が必要になったため気軽に使えなくなりました。

  • TYPE_PHONE
  • TYPE_PRIORITY_PHONE
  • TYPE_SYSTEM_ALERT
  • TYPE_SYSTEM_ERROR
  • TYPE_SYSTEM_OVERLAY
使用するには「他のアプリの上に表示」という設定から権限を与える必要あります。

----------
最後に確認したOSバージョンはAndroid 7.0です

AndroidはGoogle Inc.の商標または登録商標です

2016年8月24日水曜日

画面を表示せずにViewのキャプチャを取得する方法

画面表示せずにViewの描画結果をビットマップ化したい!

画面表示時にFWが勝手にやってくれることの一部をやってあげてからdrawing cacheを取得すれば可能です。



1.対象のViewをinflateする

    ViewGroup frame = LayoutInflater.from(context).inflate(R.layout.target, null);


2.Viewのサイズを確定させ子Viewをレイアウトする

    frame.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

    frame.layout(0, 0, frame.getMeasuredWidth(), frame.getMeasuredHeight());


3.DrawingCacheを取得する

    frame.setDrawingCacheEnabled(true);
    frame.buildDrawingCache(true);
    Bitmap bitmap = Bitmap.createBitmap(frame.getDrawingCache());

    // destroy drawing cache.
    frame.setDrawingCacheEnabled(false);
    frame.destroyDrawingCache();



あとは取得したbitmapを焼くなり煮るなりしてください。

----------
最後に確認したOSバージョンはAndroid 6.0です

AndroidはGoogle Inc.の商標または登録商標です



2016年8月21日日曜日

アプリが前面(フォアグランド)にいるかを知る

アプリが前面(フォアグランド)にいるかを知りたい!


ActivityLifecycleCallbackを使用

ApplicationクラスでActivityLifecycleCallbackを受けて、onStopとonPauseでカウントする方法です。
最も一般的方法。


ActivityManager#getRunningAppProcessを使用

Lollipop以降は自アプリとホームアプリの情報しか取得出来なくなりましたが、何かの理由でホームアプリの状態を知りたい場合に有効です。

具体的にはRunningAppProcessInfo#importanceの値をチェックします。
値がIMPORTANCE_FOREGROUNDだった場合がフォアグランドにいる場合となりますが、注意しなければいけないのが、フォアグランドの他アプリからServiceがbindされている場合もIMPORTANCE_FOREGROUNDになるため(OSから見れば同レベルに重要って事かな?)、importanceReasonCodeのチェックも必要です。


UsageStatsManagerを使用

全てのアプリの状態を知りたい場合、Lollipop以降はこれを使用する必要がandroid.permission.PACKAGE_USAGE_STATSをuses宣言する必要があるかつ、ユーザ操作でセキュリティ設定(使用履歴にアクセスするアプリ)を有効にして貰う必要があり、とても使い勝手が悪いです。

----------
最後に確認したOSバージョンはAndroid 6.0です

AndroidはGoogle Inc.の商標または登録商標です


2016年8月20日土曜日

[Android N]Accessibility ImprovementsのScreen Zoomについて

Android N(7.0)から実装されているScreen Zoom機能とは??

変更するとViewが大きくなったり小さくなったりします。
どのような仕組みで実現しているのかというと至って単純で、論理的にDensityを変更しているだけです。

わかりやすく言うと以下のような動作になります。

  • DisplaySize設定を大きくする → Densityを大きくする
  • DisplaySize設定を小さくする → Densityを小さくする

例えば160dpi(mdpi)端末の場合、defaultのdensityは1となり、スクリーンに表示されるViewのサイズはdp指定値とイコールとなります。
この端末でDisplaySize設定を大きくすると240dpi(hdpi)や320dpi(xhdpi)端末として振舞うようになるため、densityが大きくなり、Viewが(hdpiなら1.5倍、xhdpiなら2倍に)拡大されるのです。



設定変更時の挙動

targetSdkVersionにより変化します。

  • 24未満の場合 → プロセス再起動されます
  • 24以上の場合 → Activityが再起動されます(言語切り替え時と同様の挙動)

元々、複数のディスプレイサイズに対応しているアプリであれば特に変更を加える必要は無いのですが、N Preview5で確認する限りでは以外な落とし穴がありました。




使用するContextによる挙動の違い(N Preview5)

N Preview5で動作確認を行ったところtargetSdkVersionを24にしてDisplay Sizeを変更すると、一部のViewだけサイズが変わらない現象が発生しました!

原因はApplicationContextを使用してViewを生成していたため。
targetSDKを24にするとプロセス再起動されなくなるため、ApplicationContextが持つdensityが変わらないようなのです(´・ω・`)

Viewの生成にApplicationContextを使用していること自体がそもそも論理的に誤りなので修正すれば良いだけなのですが、問題はこれだけではありません。

Serviceも再起動されないため、Serviceから表示しているToastのサイズも変わりません!

Google先生、これ、仕様ですか!?

----------
最後に確認したOSバージョンはAndroid N Preview5です


AndroidはGoogle Inc.の商標または登録商標です



アプリが使用してる全てのpermissionを知る

端末内にインストールされているAndroidアプリが何のパーミッションを使用しているのか知りたい!

Android標準のパーミッションであればアプリの設定から見れますけど、独自宣言しているpermissionまではわかりません。
それが知りたい事が極稀ですがあります。

そんなときに見るが以下ファイル。
/data/system/packages.xml

インストールされている全てのパッケージの情報や、暗黙的Intentのデフォルト起動情報などが記録されているのでこれを見れば一目瞭然です。

----------
最後に確認したOSバージョンはAndroid 6.0です
この投稿はroot限定情報です

AndroidはGoogle Inc.の商標または登録商標です