我现在是这样计算屏幕宽度的:
public static int getScreenWidth(@NonNull Context context) {
DisplayMetrics displayMetrics = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.widthPixels;
}
由于这两个函数(getDefaultDisplay()和getMetrics())现在已弃用,我们应该使用什么来代替?
8条答案
按热度按时间zd287kbt1#
要计算屏幕宽度减去任何系统栏,以下操作应该有效:
请注意,这并不完全相同:用height测试这个会产生不同的结果,我无法用新API复制旧API的功能(部分原因是旧API的行为有点难以推理,并且不总是你想要的,因此它被弃用)。不过,在实践中,它应该足够好,作为一个通用的屏幕宽度为许多事情。
cczfrluj2#
这需要
androidx.core
版本1.5.x
wpx232ag3#
在2022年遇到同样的问题,有一个新的Jetpack库可以在各种API版本中处理这个问题。
build.gradle
我遇到的一个警告是,包括
androidx.window
最终会拉入数万个库方法,使我超过DEX 64 k方法限制,所以我必须弄清楚如何使用R8/proguard设置优化这些方法,但这是另一个问题。vbopmzt14#
我想我已经成功地实现了等效的方法(改进了@RyanM的方法)。
要点是
1.窗口边界的高度中不包括SystemBar的高度。我们应该只排除NavigationBar的高度(除非它在手机设备上处于横向模式)。
1.在手机设备的横向模式下,我们应该从窗口边界的宽度中排除NavigationBar的大小。
测试
肖像:
景观:
肖像:
景观:
肖像:
景观:
6jjcrrmo5#
busg9geu6#
这里大部分的答案都是用
windowManager.getCurrentWindowMetrics()
方法来得到屏幕大小。但这不会给予实际的(物理设备)屏幕大小。如果屏幕处于拆分模式,应用程序将只占用屏幕的一部分,并且它将给予该大小而不是全屏大小。因此,要获得全屏大小,建议使用
windowManager.getMaximumWindowMetrics()
方法。suzh9iv87#
基于以前的答案;添加显示剪切:
68de4m5k8#
可以使用
Context.getDisplay()
而不是getDefaultDisplay()
display.getRealMatrix(displayMetrics)
而不是display.getMetrics(displayMetrics)