🍣

Androidの画面サイズを取得について

2024/10/20に公開

概要

各表示領域に関する認識があやふやだったので、ざっとまとめておく

status bar

  • 端末によってサイズが変化する
  • 表示/非表示によってサイズが変化する
// status barvar resourceId = applicationContext.resources.getIdentifier("status_bar_height", "dimen", "android")
val statusBarHeight = applicationContext.resources.getDimensionPixelSize(resourceId)
Logging.i(LOG_TAG, "getStatusBar height(px) = $statusBarHeight")

display area

  • status bartitle barnavigation barを含まない表示領域
// contents areaval size = Rect()
this.window.decorView.getWindowVisibleDisplayFrame(size)
val contentsAreaHeight = size.height()
Logging.i(LOG_TAG, "getContentsArea height(px) = $contentsAreaHeight")

real display area

  • status bartitle barnavigation barを含む表示領域
  • ソフトウェアキーの領域
  • 端末や縦/横によってサイズが変化する
// navigation bar
resourceId = applicationContext.resources.getIdentifier("navigation_bar_height", "dimen", "android")
val navigationBarHeight = applicationContext.resources.getDimensionPixelSize(resourceId)
Logging.i(LOG_TAG, "getNavigationBar height(px) = $navigationBarHeight")

詳細

導入方法(使用方法)

環境(記述時)

macOS                      : macOS Monterey v12.3(Apple M1)
AndroidStudio              : Bumblebee | 2021.1.1 Path2
Kotlin                     : 1.6.10
AndroidGradlePluginVersion : 7.1.2
GradleVersion              : 7.2
compileSdkVersion          : 31

利用例

取得方法

Displayクラス(API29以降非推奨) 参照

val wm = getSystemService(WINDOW_SERVICE) as WindowManager
        val display: Display = wm.defaultDisplay
        val winW = display.getWidth()
        val winH = display.getHeight()

DisplayMetricsクラス(API30以降非推奨) 参照

※現在時点(2022/04/07)ではdefaultDisplayが非推奨となっている

val dm = DisplayMetrics()
        windowManager.~~defaultDisplay.getMetrics~~(dm)
        val winW = dm.widthPixels
        val winH = dm.heightPixels

汎用

px⇔dp変換

// px→dpfun 
Int.toDp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()
// dp→pxfun 
Int.toPx(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()

DataBindingを使ってサイズを指定

widthとheightを渡せるBindingAdapter

※ここで渡すのはpx想定

  1. Adapter作成
// BindingAdapters.kt(にあたる?)@BindingAdapter("width", "height", requireAll = true)
@JvmStatic
fun View.setLayoutParams(width: Int?, height?) {
    width ?: return
    height ?: return
    layoutParams = View.LayoutParams(width, height)
}
  1. Viewの適用
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable name="width" type="java.lang.Integer"/>
        <variable name="height" type="java.lang.Integer"/>
    </data>

    <View
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            width="@{width}"
            height="@{height}"/>
</layout>

Fragmentのサイズを取得する方法(余談)

https://qiita.com/all_fort/items/73c75449d3056133c3af

画面サイズ取得

  • 以下の方法で取得できるのは画面のpx数
  • dpが必要な場合は上記のpx⇔dp変換を使用する
// 幅取得fun Activity.getWindowWidth(): Int {
    val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val disp = wm.defaultDisplay
    val windowWidth = Point()
    disp.getSize(windowWidth)

    return windowWidth.x
}

// 高さ取得fun Activity.getWindowHeight(): Int {
    val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val disp = wm.defaultDisplay
    val windowHeight = Point()
    disp.getSize(windowHeight)

    return windowHeight.y
}

参考資料

Discussion