Android开发 获取屏幕宽高及尺寸的方法
android开发 获取屏幕宽高及尺寸的方法。
// 通过windowmanager获取 displaymetrics dm = new displaymetrics(); getwindowmanager().getdefaultdisplay().getmetrics(dm); system.out.println("width-display :" + dm.widthpixels); system.out.println("heigth-display :" + dm.heightpixels); // 通过resources获取 displaymetrics dm2 = getresources().getdisplaymetrics(); system.out.println("width-display :" + dm2.widthpixels); system.out.println("heigth-display :" + dm2.heightpixels); // 获取屏幕的默认分辨率 display display = getwindowmanager().getdefaultdisplay(); system.out.println("width-display :" + display.getwidth()); system.out.println("heigth-display :" + display.getheight());
以上为获取屏幕宽高分辨率的三种方法
安卓6.0的nexus 6手机使用以上方法取得准确的宽度分辨率,但是高度分辨率并不准确(与状态栏和主题有关,某些情况下准确),如何获取完全准确的宽、高分辨率请参考下文;在安卓4.2的某手机中,使用方法一得到了正确的屏幕尺寸值,而使用方法二和三得到的值全部为零。原因不祥。其中方法三中的display.getwidth()和display.getheight()已被弃用。
[java]view plaincopy
displaymetricsdm=newdisplaymetrics();
getwindowmanager().getdefaultdisplay().getmetrics(dm);
//display=getwindowmanager().getdefaultdisplay();
//display.getmetrics(dm)(把屏幕尺寸信息赋值给displaymetricsdm);
width=dm.widthpixels;height=dm.heightpixels;
xdpi=dm.xdpi;ydpi=dm.ydpi;
density=dm.densitydpi;fdensity=dm.density;
查询log,得到各值如下:
d/lichking(22643): -----------widthpixels---540
d/lichking(22643): -----------heightpixels---960
d/lichking(22643): -----------xdpi---244.92857
d/lichking(22643): -----------ydpi---246.30302
d/lichking(22643): -----------density---240
另提一点,我们通常所指的屏幕上的int尺寸是像素单位,如需在java代码中使用dp设定宽高请参考以下两个方法。 [java]view plaincopy
//pixel=dip*density;
privateintconvertdptopixel(intdp){displaymetricsdisplaymetrics=mcontext.getresources().getdisplaymetrics();
return(int)(dp*displaymetrics.density);}
privateintconvertpixeltodp(intpixel){
displaymetricsdisplaymetrics=mcontext.getresources().getdisplaymetrics();return(int)(pixel/displaymetrics.density);
}由于根据以上方法获取屏幕尺寸会有部分情况因为状态栏或其他缘故获取不到正确的分辨率,所以获取准确的分辨率可用以下方式获得:
[java]view plaincopyprivatevoidgetdisplayinfomation(){
pointpoint=newpoint();getwindowmanager().getdefaultdisplay().getsize(point);
log.d(tag,"thescreensizeis"+point.tostring());//获取正确尺寸(此方法要求最低api为17,即安卓4.2,4.2之前获取请参看以下获取屏幕尺寸的方法)
getwindowmanager().getdefaultdisplay().getrealsize(point);log.d(tag,"thescreenrealsizeis"+point.tostring());
}获取屏幕尺寸的方法如下:
[java]view plaincopyprivatestaticdoubleminch=0;
/***获取屏幕尺寸
*@paramcontext*@return
*/publicstaticdoublegetscreeninch(activitycontext){
if(minch!=0.0d){returnminch;
}try{
intrealwidth=0,realheight=0;
displaydisplay=context.getwindowmanager().getdefaultdisplay();displaymetricsmetrics=newdisplaymetrics();
display.getmetrics(metrics);if(android.os.build.version.sdk_int>=17){
pointsize=newpoint();display.getrealsize(size);
realwidth=size.x;realheight=size.y;
}elseif(android.os.build.version.sdk_int&&android.os.build.version.sdk_int>=14){methodmgetrawh=display.class.getmethod("getrawheight");
methodmgetraww=display.class.getmethod("getrawwidth");
realwidth=(integer)mgetraww.invoke(display);realheight=(integer)mgetrawh.invoke(display);
}else{realwidth=metrics.widthpixels;
realheight=metrics.heightpixels;}
minch=formatdouble(math.sqrt((realwidth/metrics.xdpi)*(realwidth/metrics.xdpi)+(realheight/metrics.ydpi)*(realheight/metrics.ydpi)),1);
}catch(exceptione){
e.printstacktrace();
}returnminch;
}
/***double类型保留指定位数的小数,返回double类型(四舍五入)
*newscale为指定的位数*/
privatestaticdoubleformatdouble(doubled,intnewscale){bigdecimalbd=newbigdecimal(d);
returnbd.setscale(newscale,bigdecimal.round_half_up).doublevalue();}