获取屏幕尺寸
从WindowManager获得
displaymetricsdm=newdisplaymetrics (;
getWindowManager ().getDefaultDisplay ).getmetrics ) ) DM;
//其中display=getwindow manager (.getdefaultdisplay ) )获取了defaultdisplay对象; 然后,display.getmetrics(DM )将屏幕大小信息分配给DisplayMetrics dm
//注意:窗口管理器可能需要通过上下文。 获取getsystemservice:windowmanagerwm=(window manager ) context.getsystemservice (context.window _ service );
DisplayMetrics和Display的关系。
Display是一个称为显示区域的对象,它可能是实际的物理屏幕,也可能只是APP应用程序的显示区域。 例如,在非全屏活动的Activity中,系统具有状态栏,因此显示区域比物理屏幕小。 显示区域的各种属性值被封装在DisplayMetrics中。 从源代码来看,DisplayMetrics中对每个属性值的注释被描述为实际的物理大小。 另外,还发现display.getmetrics(DM )这个函数基本上在取得实际的画面尺寸时被应用。 记住这个就好了。
注:构造函数DisplayMetrics不需要传递参数。 调用getWindowManager ()将检索现有活动的句柄。 然后,diplay将获取的高度宽度存储在DisplayMetrics对象中。 获取的高度宽度以像素为单位,“像素”指的是“绝对像素”而不是“相对像素”。
DisplayMetrics对象dm可提供以下信息
width=dm.widthPixels;
height=dm.heightPixels;
xdpi=dm.xdpi;
ydpi=dm.ydpi;
density=dm.densityDpi;
fdensity=dm.density;
将dp和px转换为相应的px值的示例:
int padding=4;
padding=(int ) typed value.apply dimension (typed value.com plex _ 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 (320 x800 )和3dp (240 x320 ),因此返回的值在不同的分辨率(getDisplayMetrics )下可获得
源代码:
publicstaticfloatapplydimension (intunit,float value,
显示测量结果)
{
switch (单元) {
case COMPLEX_UNIT_PX:
返回值;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaled density;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72;
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4 f;
}
返回0;
}
时间: 2016-03-19