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
La altura de la pantalla recolectada es 1920, pero debido a navitaionbar
la existencia, la altura del área efectiva real es solo 1794
case2: pantalla no completa sin barra de navegación
Cuando no hay barra de navegación, la altura efectiva real obtenida también es 1920
case3: pantalla completa
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 getScreenRealHeight
obtener 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
}
}