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.の商標または登録商標です



0 件のコメント:

コメントを投稿