详解Android应用中屏幕尺寸的获取及dp和px值的转换
获取屏幕尺寸
通过WindowManager获取
DisplayMetricsdm=newDisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); //其中display=getWindowManager().getDefaultDisplay()获得了一个DefaultDisplay对象;然后display.getMetrics(dm)把屏幕尺寸信息赋值给DisplayMetricsdm //注意:WindowManager有时候需要通过context。getSystemService获取:WindowManagerwm=(WindowManager)context.getSystemService(context.WINDOW_SERVICE);
DisplayMetrics和Display的关系。;
Display指代显示区域这个对象,它可能是真实的物理屏幕,也可能仅指应用程序的显示区域,比如在非全屏Activity里,系统因为有状态栏,因此显示区域要比物理屏幕要小。DisplayMetrics里封装了显示区域的各种属性值。查看源码发现,在DisplayMetrics对各个属性值的注释都说明为真实的物理尺寸。而且也发现display.getMetrics(dm)这一函数基本在应用在获取真实屏幕尺寸的时候。记住这一点即好。
注:构造函数DisplayMetrics不需要传递任何参数;调用getWindowManager()之后,会取得现有Activity的Handle。然后,diplay将取得的宽高维度存放于DisplayMetrics对象中,而取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”。
通过DisplayMetrics对象dm可以获得如下信息
width=dm.widthPixels; height=dm.heightPixels; xdpi=dm.xdpi; ydpi=dm.ydpi; density=dm.densityDpi; fdensity=dm.density;
将dp和px转化成对应的px数值的实例:
intpadding=4; padding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,4, context.getResources().getDisplayMetrics());
解释:
padding的单位是:dip,padding的大小是:4
虽然是4dip,但是,不是最终padding的真实单位。
他是通过计算以后,4dp和密度系数相乘得到的一个值,实际上计算出来的padding单位是像素,也就是它的宽度。在不同dpi的屏幕上,这个值是不一样的。
即:将dp转化为px,返回的是一个dp对应的px数值。
如果这里是COMPLEX_UNIX_SP,就是讲sp转化为dp。
单位间的转换就用这个方法,可以将其封装成一个工具方法。
进一步理解:
applyDimension方法是将4像素转换为6dp(480x800)、4dp(320x800)、3dp(240x320),所以返回的值对应不同的分辨率(通过getDisplayMetrics就得到了)就是6、4、3
源代码:
publicstaticfloatapplyDimension(intunit,floatvalue, DisplayMetricsmetrics) { switch(unit){ caseCOMPLEX_UNIT_PX: returnvalue; caseCOMPLEX_UNIT_DIP: returnvalue*metrics.density; caseCOMPLEX_UNIT_SP: returnvalue*metrics.scaledDensity; caseCOMPLEX_UNIT_PT: returnvalue*metrics.xdpi*(1.0f/72); caseCOMPLEX_UNIT_IN: returnvalue*metrics.xdpi; caseCOMPLEX_UNIT_MM: returnvalue*metrics.xdpi*(1.0f/25.4f); } return0; }