Slide 1

Slide 1 text

screenWidthDpちょっと 怖いかも、、??

Slide 2

Slide 2 text

目次 ● 自己紹介 ● 結論 ● 基礎知識 ● screenWidthDpについて ● 何が落とし穴? ● screenWidthDpをもとにpxを作ると? ● 改めて結論

Slide 3

Slide 3 text

自己紹介 財部彰太 twitter : rabe_hamuyatti 株式会社ZOZO 2023新卒 ZOZOTOWNのAndroidアプリを作って います。 旅行とか、服とか、音楽が好きです。

Slide 4

Slide 4 text

結論 画面幅をpxの単位でほしい時は、Configuration.screenWidthDpをpxに変換すると正 確な値が取れない。 BoxWithConstraintsScope.maxWidthにtoPxをかけたもの または Resources.getSystem().displayMetrics.width を使おう。

Slide 5

Slide 5 text

基礎知識 px → デジタル画像の最小単位。 dpi(dot per inch) → 1インチあたりのドット数。画面密度 dp(density-independent pixels) → 密度非依存ピクセル。dpが端末の画面密度に応じてpxに変換され、ユーザーの目に 届く。

Slide 6

Slide 6 text

screenWidthDpについて dp単位で表示可能な画面領域の幅のこと。(WindowInsetを除いた値) 取得方法 ● Resources.getSystem().configuration.screenWidthDp ● LocalConfiguration.current.screenWidthDp 公式Document https://developer.android.com/reference/android/content/res/Configuration#screenWidthDp

Slide 7

Slide 7 text

何が落とし穴? Floatではなく、Intで保存されていること (BoxWithConstraintsScope.maxWidthはFloat) DPを求める式は 画面幅(px) * 160 / dpi → 割り切れなさそうじゃない、、?? 計算式 https://developer.android.com/training/multiscreen/screendensities?hl=ja#dips-pels screenWidthDpの実際のコード https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/res/Configurat

Slide 8

Slide 8 text

何が落とし穴? 実際、Pixel6では 横幅 → 1080px dpi → 420 1080 * 160 / 420 = 411.4285 → ScreenWidthDpはIntのため、端数が切り落とされ411で保存されている 公式Document https://developer.android.com/reference/android/content/res/Configuration#screenWidthDp

Slide 9

Slide 9 text

screenWidthDpをもとにpxを作ると? LocalConfiguration.current.screenWidthDp.dp.toPx() や Resources.getSystem().configuration.screenWidthDp  * resources.displayMetrics.densityDpi / 160 → 1078.875 本来の1080とずれてしまっている!!!

Slide 10

Slide 10 text

改めて。 px単位で正確な画面横幅を知りたいときは Resources.getSystem().displayMetrics.widthPixels BoxWithConstraintsScope.maxWidthをpxに変換 を使いましょう。(他にもあるかも?)

Slide 11

Slide 11 text

おしまい!