zoukankan      html  css  js  c++  java
  • Android Density(密度)

    1.  什么是density

    引用
    1) density
    density表示每英寸有多少个显示点(逻辑值),它的单位是dpi:dot per inch,通常屏幕大时,density就大,屏幕小时,density就小,通常
    屏幕实际分辨率为240px*400px时,density=120
    屏幕实际分辨率为320px*533px,density=160
    屏幕实际分辨率为480px*800px,density=240

    2)  分辨率
    是整个屏是多少点,比如800x480,它是软件的显示单位

    3) 从Android1.6版本开始支持density(对应API Level 4)
    用于解决应用在屏幕大小不同的硬件上正常显示的问题

    2. 相关代码及设置

    引用
    1)  AndroidManifest.xml

    这个参数在API Level 4也就是SDK 1.6以后才启用的,而且1.6版本的API Level 4的应用默认值就是True

    2) 资源目录名(android 2.0以后)
    res/xxx-hdpi         当density为240时,使用此目录下的资源
    res/xxx-mdpi        当density为160时,使用此目录下的资源
    res/xxx-ldpi          当density为120时,使用此目录下的资源
    res/xxx                 不常后缀,为默认设置,同xxx-mdpi

    3) 资源单位(xml文件中定义大小的单位)

    a)  dp=dip=dx (Density independent pixel)
    基于屏幕密度的抽象单位,设备无关的点,用于说明与密度无关的尺寸和位置。这些单位是相对于一个160dpi的屏幕,所有一个dp是160dpi屏幕上的一个点。

    b)  px
    px指软件的单位点,设备相关的点

    c)  具体使用

    i.布局时尽量使用单位dip,少使用px
    若使用px,如果设某控件大小400x400px,在800x480上显示正常,而在533x320的屏上就超出屏幕了
    若使用dp,如果设某控件大小为160x160dp,就可以通过从系统中取density来算出真正的大小,比如在800x480屏的density设为240,而533x320屏的density设为160,借以下公式计算
    pixels = dips * (density / 160)
    在800x480在屏中显示240象素,而在533x320的屏中显示为160象素,控件在屏中显示的比例是一样的。

    ii. 内部的处理过程分为三步:
    取screen中其它元素,转为应用的值,计算应用各控件位置,然后再转成800x480以供真正显示
    若res-xxx不存在,则读取res有的资源,然后对其做相应缩放



    3. 实现density的关键源码

    引用
    1)         BitmapFactory.java(用于缩放图片)

    2)         ComptibilityInfo.java(用于位置计算)



    4、取得屏幕信息(宽高等)

    Java代码  收藏代码
    1. public static String getDisplayMetrics(Context cx) {  
    2.   String str = "";  
    3.   DisplayMetrics dm = new DisplayMetrics();  
    4.   dm = cx.getApplicationContext().getResources().getDisplayMetrics();  
    5.   int screenWidth = dm.widthPixels;  
    6.   int screenHeight = dm.heightPixels;  
    7.   float density = dm.density;  
    8.   float xdpi = dm.xdpi;  
    9.   float ydpi = dm.ydpi;  
    10.   str += "The absolute " + String.valueOf(screenWidth) + "pixels ";  
    11.   str += "The absolute heightin:" + String.valueOf(screenHeight)  
    12.       + "pixels ";  
    13.   str += "The logical density of the display.:" + String.valueOf(density)  
    14.       + " ";  
    15.   str += "X dimension :" + String.valueOf(xdpi) + "pixels per inch ";  
    16.   str += "Y dimension :" + String.valueOf(ydpi) + "pixels per inch ";  
    17.   return str;  
    18. }  

     

    5 取得状态栏和标题栏高度

    Java代码  收藏代码
    1. TextView tv1;  
    2.   
    3. @Override  
    4. protected void onCreate(Bundle savedInstanceState) {  
    5.   super.onCreate(savedInstanceState);  
    6.   setContentView(R.layout.layout_test2);  
    7.   tv1 = (TextView) findViewById(R.id.TextView01);  
    8.   tv1.post(new Runnable(){   
    9.     public void run()   
    10.     {   
    11.       processLayout();   
    12.     }   
    13.   });   
    14. }  
    15.   
    16. private void processLayout(){  
    17.     
    18.   Rect rect= new Rect();   
    19.   Window window= getWindow();   
    20.   tv1.getWindowVisibleDisplayFrame(rect);   
    21.   //状态栏高度  
    22.   int statusBarHeight= rect.top;   
    23.   int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();   
    24.   //标题栏高度  
    25.   int titleBarHeight= contentViewTop - statusBarHeight;   
    26.   //测试结果:ok之后 100多 ms 才运行了   
    27.   Log.v("test""=-init-= statusBarHeight="+statusBarHeight+   
    28.   " contentViewTop="+contentViewTop+   
    29.   " titleBarHeight="+titleBarHeight);      
    30.   
    31. }  

     


  • 相关阅读:
    Fast polling using C, memcached, nginx and libevent
    为什么MongoDB可以替代MySQL?
    comet server 的介绍及方案选型
    多任务服务器架构设计
    基于libev面向分布式数据系统的C10K服务器设计
    libev & libevent简介
    memcached、redis、mysql、mongodb结合架构数据库系统
    删除数组中的重复元素
    不用运算符比较两个int数的大小
    JDBC之简介
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748347.html
Copyright © 2011-2022 走看看