🍣
Androidの画面サイズを取得について
概要
各表示領域に関する認識があやふやだったので、ざっとまとめておく
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 bar, title bar, navigation 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 bar, title bar, navigation barを含む表示領域
navigation 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想定
- Adapter作成
// BindingAdapters.kt(にあたる?)@BindingAdapter("width", "height", requireAll = true)
@JvmStatic
fun View.setLayoutParams(width: Int?, height?) {
width ?: return
height ?: return
layoutParams = View.LayoutParams(width, height)
}
- 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のサイズを取得する方法(余談)
画面サイズ取得
- 以下の方法で取得できるのは画面の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