DisplayMetric 功能 屏幕 固定尺寸 dp

来源:互联网 发布:python课程设计代码 编辑:程序博客网 时间:2024/06/07 21:05
displayMetric: 翻译为: 显示的尺寸第一种写法:     DisplayMetrics dm = getResources().getDisplayMetrics();第二种:    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
如果你在setcontentview之前调用getResources().getDisplayMetrics();获取到的宽高就是不准确的,因为那时候你的资源文件还没有载入内存,而windowmanager获取到的宽高就可以,因为activity是和窗口关联着的,启动activity意味着你已经得到了窗口属性,所以可以争取获得宽高。


=======================================================================================
  1. DisplayMetrics metric = new DisplayMetrics();  
  2. //API 17之后使用,获取的像素宽高包含虚拟键所占空间,在API 17之前通过反射获取  
  3. context.getWindowManager().getDefaultDisplay().getRealMetrics(metric);  
  4. //获取的像素宽高不包含虚拟键所占空间  
  5. //context.getWindowManager().getDefaultDisplay().getMetrics(metric);  
  6. int width = metric.widthPixels;  // 宽度(像素)  
  7. int height = metric.heightPixels;  // 高度(像素)  
  8. float density = metric.density;  // dp缩放因子  
  9. int densityDpi = metric.densityDpi;  // 广义密度  
  10. float xdpi = metric.xdpi;//x轴方向的真实密度  
  11. float ydpi = metric.ydpi;//y轴方向的真实密度 

(名词详细解释:http://xiaoyaozjl.iteye.com/blog/2178415)

getRealMetrics()和getMetrics()获取到的屏幕信息差别只在于widthPixels或heightPixels的值是否去除虚拟键所占用的像素,和是否全屏和沉浸模式无关。

 

屏幕高度值包含了状态栏的像素,非沉浸模式下真实的Activity高度需要减去状态栏的高度。获取状态栏高度代码:

  1. private int getStatusBarHeight() {  
  2.     Rect rect = new Rect();  
  3.     getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);  
  4.     return rect.top;  
  5. }  

 

屏幕参数Width和Height的值和屏幕方向有关,另外4个值和屏幕方向无关。

==========================================================================
延伸的公式:

    1. //API 17之后使用,获取的像素宽高包含虚拟键所占空间,在API 17之前通过反射获取  
    2. context.getWindowManager().getDefaultDisplay().getRealMetrics(metric);  
    3. //获取的像素宽高不包含虚拟键所占空间  
    4. //context.getWindowManager().getDefaultDisplay().getMetrics(metric);
 float scale = context.getResources().getDisplayMetrics().density;

屏幕的dp数:
widthDps = widthPixels * 160 / density = widthPixels / factor
heightDps = heightPixels * 160 / density = heightPixels / factor

维持widget在不同密度屏幕的比例:
所谓维持比例也就是说widget尺寸和屏幕尺寸的比值相同,有
WidgetWidthDpA / ScreenWidthDpA = WidgetWidthDpB / ScreenWidthDpB ,那么
WidgetWidthDpB = WidgetWidthDpA * ScreenWidthDpB / ScreenWidthDpA ,或
WidgetWidthDpB = WidgetWidthDpA * rate
其中rate = (screenWidthPixelsB / densityB) / (screenWidthPixelsA / densityA)
实际使用中,因为这个比值不仅和广义密度比有关并且和分辨率比有关,要完整适配所有设备比较困难,一般推荐使用空白区变长的方法完成适配而不是维持画面比例。
===================================



最重要的来了:
手机看到的 宽高是固定的 width=320dp,height=480dp;
 负的在屏幕的左边,大于320的在屏幕的右边,这些是你看不到的;高也可以类推你懂。

 float scale = context.getResources().getDisplayMetrics().density;
 float widthPx=dp*scale + 0.5f;//dp 转px

0 0