初めてのkotlin

kotlinによるAndroidアプリ開発での気付き

ディスプレイ周りの各種サイズの取得

ステータスバーやナビゲーションバーなど、 画面関係のサイズや座標を取得します。 activity引数には、Activityから呼び出す時はthisを指定すればOKです。

ディスプレイサイズの取得
fun getRealDisplaySize(activity: Activity): Point {
    val outSize = Point()
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
        activity.display?.getRealSize(outSize)
    else
        activity.windowManager.defaultDisplay.getRealSize(outSize)
    return outSize
}

物理的な画面サイズです。

アプリケーションエリアのサイズ
fun getApplicationDisplaySize(activity: Activity): Point {
    return Point(
        activity.resources.displayMetrics.widthPixels,
        activity.resources.displayMetrics.heightPixels
    )
}

ディスプレイサイズからナビゲーションバーを除いた大きさです。

アプリケーション表示エリア
fun getApplicationVisibleArea(activity: Activity): Rect {
    val outRect = Rect()
    activity.window.decorView.getWindowVisibleDisplayFrame(outRect)    //アプリケーション表示エリア(バーの状態によって変化する)
    return outRect
}

ステータスバーとナビゲーションバーを除いた範囲の座標です。

この値は、フルスクリーンモードでは画面全体の座標に変化します。

ステータスバーの高さ
fun getStatusBarHeight(activity: Activity): Int {
    val resourceId = activity.resources.getIdentifier("status_bar_height", "dimen", "android")
    return if (resourceId > 0)
        activity.resources.getDimensionPixelSize(resourceId)
    else {
        val rect = getApplicationVisibleArea(activity)
        rect.top
    }
}

テストした範囲では、フルスクリーンモードでも正しい値が取得できています。

タイトルバー(ActionBar)の高さ
fun getActionBarHeight(activity: Activity): Int {
    val styledAttr: TypedArray = activity.theme.obtainStyledAttributes(intArrayOf(R.attr.actionBarSize))
    val px = styledAttr.getDimension(0, 0f).toInt()
    styledAttr.recycle()
    return px
}

ToolBarで機能するかどうかは確認していません。

ナビゲーションバーの高さ
fun getNavigationBarHeight(activity: Activity): Int {
    val real = getRealDisplaySize(activity)     //スクリーンサイズ
    val app = getApplicationDisplaySize(activity)     //アプリケーション表示エリア
    return real.y - app.y
}