[Android] Resumen de métodos para obtener la altura de la barra de estado, la altura de la barra de navegación y el tamaño de pantalla completa

1. Obtenga la altura de la pantalla


/**
   * Get screen height
   * The first one is to read the heightPixels parameter of DisplayMetrics
 */
private fun getScreenHeight(context: Context): Int {
    
    
    return context.resources?.displayMetrics?.heightPixels ?: 0
}

/**
   * Get screen Real height
   * The second type is to read the defaultDisplay parameter in windowManager
 */
@Volatile
private var sRealSizes = arrayOfNulls<Point>(2)
private fun getScreenRealHeight(context: Context): Int {
    
    
    var orientation = context.resources?.configuration?.orientation
    orientation = if (orientation == 1) 0 else 1
    if (sRealSizes[orientation] == null) {
    
    
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val display = windowManager.defaultDisplay
        val point = Point()
        display.getRealSize(point)
        sRealSizes[orientation] = point
    }
    return sRealSizes[orientation]?.y ?: getScreenRealHeight(context)
}

Cuando usamos el código anterior para obtener la altura de la pantalla, encontraremos que la altura es diferente en diferentes casos:

case1: pantalla no completa con barra de navegación

Inserte la descripción de la imagen aquí
La altura de la pantalla recolectada es 1920, pero debido a navitaionbarla existencia, la altura del área efectiva real es solo 1794

case2: pantalla no completa sin barra de navegación

Inserte la descripción de la imagen aquí
Cuando no hay barra de navegación, la altura efectiva real obtenida también es 1920

case3: pantalla completa

Inserte la descripción de la imagen aquí
En la pantalla completa, incluso si no hay barra de navegación, la altura efectiva sigue siendo diferente de la altura real, así que intente utilizar la pantalla completa para getScreenRealHeightobtener la altura de la pantalla

En conclusión

En resumen, cómo obtener la altura de la pantalla en varios casos.

if (DeviceUtils.isAllScreenDevice()) {
    
    
    // The full screen needs to get the height through this method
    screenHeight = DisplayUtils.getScreenRealHeight(getContext());
} else {
    
    
    screenHeight = DisplayUtils.getScreenHeight(getContext());
}

2. Obtenga el ancho de la pantalla


private fun getScreenWidth(context: Context): Int {
    
    
    return context.resources?.displayMetrics?.widthPixels ?: 0
}

private fun getScreenRealWidth(context: Context): Int {
    
    
    var orientation = context.resources?.configuration?.orientation
    orientation = if (orientation == 1) 0 else 1
    if (sRealSizes[orientation] == null) {
    
    
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val display = windowManager.defaultDisplay
        val point = Point()
        display.getRealSize(point)
        sRealSizes[orientation] = point
    }
    return sRealSizes[orientation]?.x ?: getScreenWidth(context)
}

3. La altura de la barra de estado


private fun getStatusBarHeight(window: Window, context: Context): Int {
    
    
    val localRect = Rect()
    window.decorView.getWindowVisibleDisplayFrame(localRect)
    var mStatusBarHeight = localRect.top
    if (0 == mStatusBarHeight) {
    
    
        try {
    
    
            val localClass = Class.forName("com.android.internal.R\$dimen")
            val localObject = localClass.newInstance()
            val i5 =
                localClass.getField("status_bar_height")[localObject].toString().toInt()
            mStatusBarHeight = context.resources.getDimensionPixelSize(i5)
        } catch (var6: ClassNotFoundException) {
    
    
            var6.printStackTrace()
        } catch (var7: IllegalAccessException) {
    
    
            var7.printStackTrace()
        } catch (var8: InstantiationException) {
    
    
            var8.printStackTrace()
        } catch (var9: NumberFormatException) {
    
    
            var9.printStackTrace()
        } catch (var10: IllegalArgumentException) {
    
    
            var10.printStackTrace()
        } catch (var11: SecurityException) {
    
    
            var11.printStackTrace()
        } catch (var12: NoSuchFieldException) {
    
    
            var12.printStackTrace()
        }
    }
    if (0 == mStatusBarHeight) {
    
    
        val resourceId: Int =
            context.resources.getIdentifier("status_bar_height", "dimen", "android")
        if (resourceId > 0) {
    
    
            mStatusBarHeight = context.resources.getDimensionPixelSize(resourceId)
        }
    }
    return mStatusBarHeight
}

4. La altura de la barra de navegación


 private fun getNavigationBarHeight(context: Context): Int {
    
    
    val rid: Int =
        context.resources.getIdentifier("config_showNavigationBar", "bool", "android")
    return if (rid != 0) {
    
    
        val resourceId: Int =
            context.resources.getIdentifier("navigation_bar_height", "dimen", "android")
        context.resources.getDimensionPixelSize(resourceId)
    } else {
    
    
        0
    }
}

5. Determine si la pantalla completa


private fun isAllScreenDevice(context: Context): Boolean {
    
    
    if (VERSION.SDK_INT < 21) {
    
    
        return false
    } else {
    
    
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val display = windowManager.defaultDisplay
        val point = Point()
        display.getRealSize(point)
        val width: Float
        val height: Float
        if (point.x < point.y) {
    
    
            width = point.x.toFloat()
            height = point.y.toFloat()
        } else {
    
    
            width = point.y.toFloat()
            height = point.x.toFloat()
        }
        if (height / width >= 1.97f) {
    
    
            return true
        }
        return false
    }
}

Supongo que te gusta

Origin blog.csdn.net/vitaviva/article/details/109144303
Recomendado
Clasificación