Android实现屏幕各尺寸的获取的示例
程序员文章站
2023-12-18 17:53:52
在开发中我们会遇到各种需要获得屏幕参数的场景,当中也有不少坑,所以现在就记录一下这些参数的获取方式。以免再入坑。
物理屏幕宽高
一、底部没有虚拟按键
这里获取到的...
在开发中我们会遇到各种需要获得屏幕参数的场景,当中也有不少坑,所以现在就记录一下这些参数的获取方式。以免再入坑。
物理屏幕宽高
一、底部没有虚拟按键
这里获取到的宽高,就是你眼睛能看到的,屏幕亮着的地方的宽高。
/** * 获取屏幕的宽 * * @param context * @return */ public static int getscreenwidth(context context) { windowmanager wm = (windowmanager) context.getsystemservice(context.window_service); displaymetrics dm = new displaymetrics(); wm.getdefaultdisplay().getmetrics(dm); return dm.widthpixels; } /** * 获取屏幕的高度 * * @param context * @return */ public static int getscreenheight(context context) { windowmanager wm = (windowmanager) context.getsystemservice(context.window_service); displaymetrics dm = new displaymetrics(); wm.getdefaultdisplay().getmetrics(dm); return dm.heightpixels; }
二、底部有虚拟按键
华为手机底部都会有一个黑色的虚拟按键(navigationbar),通过上面这个方式得到的屏幕高度是屏幕真是高度-虚拟按键的高度。所以有虚拟按键的情况获取屏幕的高度就是另一种方法了。
public static int getrealheight(context context) { windowmanager wm = (windowmanager) context.getsystemservice(context.window_service); display display = wm.getdefaultdisplay(); int screenheight = 0; if (build.version.sdk_int >= build.version_codes.jelly_bean_mr1) { displaymetrics dm = new displaymetrics(); display.getrealmetrics(dm); screenheight = dm.heightpixels; //或者也可以使用getrealsize方法 // point size = new point(); // display.getrealsize(size); // screenheight = size.y; } else if (build.version.sdk_int >= build.version_codes.ice_cream_sandwich) { try { screenheight = (integer) display.class.getmethod("getrawheight").invoke(display); } catch (exception e) { displaymetrics dm = new displaymetrics(); display.getmetrics(dm); screenheight = dm.heightpixels; } } return screenheight; }
虚拟按键高度
虚拟按键(navigationbar)高度可以通过读取定义在android系统尺寸资源中的 navigation_bar_height 获得。
所以不管虚拟按键是显示还是隐藏,得到的结果都是一样的。
public static int getnavigationbarheight(context context) { int navigationbarheight = -1; resources resources = context.getresources(); int resourceid = resources.getidentifier("navigation_bar_height","dimen", "android"); if (resourceid > 0) { navigationbarheight = resources.getdimensionpixelsize(resourceid); } return navigationbarheight; }
状态栏高度
状态栏就是屏幕顶部显示时间,电池,wifi 等信息的栏目。
方法一:系统提供了一个resource类,通过这个类可以获取资源文件,借此可以获取 到status_bar_height 。
public int getstatusbarheight() { int result = 0; int resourceid = getresources().getidentifier("status_bar_height", "dimen", "android"); if (resourceid > 0) { result = getresources().getdimensionpixelsize(resourceid); } return result; }
方法2: 通过放射
android的所有资源都会有惟一标识在r类中作为引用。我们也可以通过反射获取r类的实例域,然后找 status_bar_height。
public void getstatusbarheightbyreflect() { int statusbarheight2 = -1; try { class<?> clazz = class.forname("com.android.internal.r$dimen"); object object = clazz.newinstance(); int height = integer.parseint(clazz.getfield("status_bar_height") .get(object).tostring()); statusbarheight2 = getresources().getdimensionpixelsize(height); } catch (exception e) { e.printstacktrace(); } log.e(tag, "状态栏高度-反射方式:" + statusbarheight2); }
借助应用区 top 属性。
状态栏位于屏幕的最顶端,坐标从 (0,0) 开始,所以应用区的顶部的位置就是状态栏的高度。
/** * 应用区的顶端位置即状态栏的高度 * *注意*该方法不能在初始化的时候用 * */ public void getstatusbarheightbytop() { rect rectangle = new rect(); getwindow().getdecorview().getwindowvisibledisplayframe(rectangle); log.e(tag, "状态栏高度-应用区顶部:" + rectangle.top); }
应用区域高度
除去状态栏剩下的都时应用区。由此可知屏幕的高度 - 状态栏高度 = 应用区的高度。
/** * 不能在 oncreate 方法中使用。 * 因为这种方法依赖于wms(窗口管理服务的回调)。正是因为窗口回调机制,所以在activity初始化时执行此方法得到的高度是0。 * 这个方法推荐在回调方法onwindowfocuschanged()中执行,才能得到预期结果。 */ public void getappviewheight(){ //屏幕 displaymetrics dm = new displaymetrics(); getwindowmanager().getdefaultdisplay().getmetrics(dm); //应用区域 rect outrect1 = new rect(); getwindow().getdecorview().getwindowvisibledisplayframe(outrect1); int statusbar = dm.heightpixels - outrect1.height(); //状态栏高度=屏幕高度-应用区域高度 log.e(tag, "应用区高度:" + statusbar); }
setcontentview 高度,view 显示的高度
需要在见面创建后才能获取到。
public static int getcontentviewheight(activity activity) { rect rectangle= new rect(); activity.getwindow().findviewbyid(window.id_android_content).getdrawingrect(rectangle); return rectangle.height(); }
标题栏高度
标题栏高度 = 应用区高度 - view 显示高度
public static void gettitlebarheight(activity activity) { rect outrect1 = new rect(); activity.getwindow().getdecorview().getwindowvisibledisplayframe(outrect1); int viewtop = activity.getwindow().findviewbyid(window.id_android_content).gettop(); //要用这种方法 int titlebarh = viewtop - outrect1.top; log.e(tag, "标题栏高度-计算:" + titlebarh); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。