モノトーンの伝説日記

Apex Legendsが大好き。

Android でユーザー側で画面サイズを弄れるスケーリング値の具体的な算出方法

 久々に開発系の話題。

 というか,Splatoon 2 自体ベッチュー #3 で終わりで次は 2 初出の亜種がでるだけなので,まあ盛り上がっていないというかw 最近は BFV ちまちま起動してます。

1. Windows では……

 Windows では一般に 25% 刻みのスケーリング設定が可能です。100% が最小値で,250% ぐらい (13.3 inch WQHD+ 3200x1800) は実機で見たことがあります。

 カスタムスケーリング設定もできるので,事実上 1% 刻みで設定は可能ですが,そういう設定で運用している人はほぼ 0 と言っていいでしょう。

2. Android では……

 Android N (7.0) からユーザーフレンドリーの Display size 設定ができるようになっています。

f:id:mntone:20181121171902p:plain:w360

 具体的に,これの DPI 値設定ってどうなるのか知らなかったんです。想像で昔の Android 標準ブラウザーのように 320dp, 360dp, 480dp みたいなキリの良い横幅設定になると思っていたんですよね。

そんなことはなかった。

 ソースコードを参照していると,そんなことはないようです。

 まず,デフォルト値を元に算出するようです。ここでは具体的に Pixel 3 XLで計算していきます。

  • デフォルトの density defaultDensity: 3.5
  • 短辺のピクセル数 minDimensionPx: 1440
  • 最大の density maxDensity: 4.5 ← [mdpiのDPI: 160] × minDimensionPx ÷ [MIN_DIMENSION_DP: 320]
  • 最大のスケーリング maxScale: 1.2857… ← min(1.5, maxDensity / defaultDensity)
  • 最小のスケーリング minScale: 0.85 (固定)

 まずここまでが基礎の計算となります。短辺が 320dp を下回らないように最大のスケーリング値を決定しているのが特徴です。

小さい方のスケール

 小さい方は Small 一つしか生成しないので,強制的に 1.0 → 0.85 の interval 0.15 のみの選択肢となります。

 Google Pixel 3 XL は 2.975 つまり 476DPI の設定となります(ああ,3.0 きっちりじゃないんだ……)

大きい方のスケール

 大きい方は最大 3 つ (Large, Very Large, Extremely Large) が存在します。

 個数の決定としては,max(min(floor((maxScale - 1) ÷ [MIN_SCALE_INTERVAL: 0.09]), 0), 3) という感じです。

 Google Pixel 3 XL では 3 つ生成できます。

 そして,interval は 1〜maxScale に等間隔になるように計算するので,0.09523… となりますね。

まとめ

 具体的な生成アルゴリズムは,ソースコードを参照のこと。

packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java - platform/frameworks/base - Git at Google

 Google Pixel 3 XL の例

スケーリング率 DPI 解像度
2.975 476dpi 484x995
3.5 560dpi 411x846
3.825 612dpi 376x774
4.1625 666dpi 346x710
4.5 720dpi 320x658

3. Apple が綺麗すぎて……

 iPhone Plus を除くすべてのデバイスで,ダウンスケーリングなしの整数倍を実現しています。

 300% スケーリング系と 100%, 200% スケーリング系で基本の仮想ドットサイズが変わるので,実はボタンの大きさは若干違ったりしますがw

 個人的には iPhone Plus はダウンスケーリング処理があるので,電話なのに無駄なリソース使ってるのが結構嫌いだったり…… (MacBook Pro もそうですが,ダウンスケーリング処理は結構重たいイメージです。)

 iPhone XS Max はそれがなくなったのと,4 inch 端末でないので,買っても良いかな,ってお気持ちになりつつありますw (iPhone SE は画面が残念なんですよね,CMS の面で。最近の端末 [Android も含んで] は CMS も OLED の調整も良くできてて,色がきちんと出ているんですよねー)

The Ultimate Guide To iPhone Resolutions

まとめ

 スケーリングは無段階で行われると思って Web サイトを設計した方が良さそうです。

 もっときっちりした間隔でスケーリング行われていると思ったのですが,最小スケールはオリジナルの 0.75 倍だと小さくなりすぎると開発時に判断されたようで,オリジナルの 0.85 倍ですし,最大スケールは 320dp を基準に最大 3 つ生成されると言った感じで。

 よく Web サイト作成で 320, 375, 414pt みたいな iPhone 系統の情報は出てくるのですが,Android 系はあまり最新の情報が出てこないなーと思ってまして。ただ,実機買うのも嫌だし,みたいなところで (いやまあ,Google Pixel 3 XL は良いなーって思ってるんですけどねw)

 具体的な数値を計算するツール作って色々な解像度でチェックした方がいいかもですね。間違いなく自分は Google Pixel 3 XL 買ったら一番小さい 484x995 で運用すると思うので。

11/22 追記

 専用のツールを作りました。320dp を下回る解像度が算出されることもあるようですね。

 本文の解説ではビット演算などは省略していますが,この計算ツールではそのあたりも正しくしているので,参考にしてください。なお,2018 冬端末から,Google Pixel 3 基準の 411dp が基本になっている端末が多いようです。

codepen.io