Android 分辨率和密度等屏幕参数相关整合

本文介绍了Android中屏幕参数的相关知识,包括像素与密度的换算公式pixels = dips * (density / 160),并列举了常见的手机分辨率如VGA、QVGA、HVGA、WVGA、FWVGA、HD、QHD、720p和1080p等。同时提及了iPhone 4/4s、iPhone 5以及小米1、小米2的屏幕分辨率。
(1)
wm size:分辨率,尺寸

wm density:密度

(2)
应用:
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为 160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,“透明地”处理所 有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式: pixels = dips * (density / 160)。举个例子,在 DPI为 240的屏幕上, 1个 DIP等于 1.5个物理像素。我们强烈推荐你用 DIP来定义你程序的界面布局,因为这样可以保证你的 UI在各种分辨率的屏幕上都可以正常显示
 
  在一个Activity的onCreate方法中,写入如下代码:

        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;  // 屏幕宽度(像素)
        int height = metric.heightPixels;  // 屏幕高度(像素)
        float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)

    一、对于界面布局方面
     1、根据物理尺寸的大小准备5套布局layout:
     (1)layout(放一些通用布局xml文件)
     (2)layout-small(屏幕尺寸小于3英寸左右的布局)
     (3)layout-normal(屏幕尺寸小于4.5英寸左右)
     (4)layout-large(4英寸-7英寸之间)
     (5)layout-xlarge(7-10英寸之间)
     2、根据需求配置不同的布局layout。
       如:240x320,则建立layout-320x240;400x800,则建立layout-800x400。需要注意的是:大的写在前面,例如320,小的写在后面,例如240;还有乘号要写成小写的x,不能写成*。
       另外,如果是通用的布局文件,则放在layout下。    
  但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。比如说,一部240x320像素的低密度手机,如果运行上述代码,获取到的屏幕尺寸是320x427。因此,研究之后发现,若没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,这样的话就大大影响了程序的编码。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:
        <supports-screens
            android:smallScreens="true"
            android:normalScreens="true"
            android:largeScreens="true"
            android:resizeable="true"
            android:anyDensity="true"/>

    这样的话,当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。
        
    (代码)
    // 获取屏幕密度(方法1)  
    int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕宽(像素,如:480px)  
    int screenHeight = getWindowManager().getDefaultDisplay().getHeight();      // 屏幕高(像素,如:800p)  
      
    Log.e(TAG + "  getDefaultDisplay", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  
      
      
    // 获取屏幕密度(方法2)  
    DisplayMetrics dm = new DisplayMetrics();  
    dm = getResources().getDisplayMetrics();  
      
    float density  = dm.density;        // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)  
    int densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)  
    float xdpi = dm.xdpi;             
    float ydpi = dm.ydpi;  
      
    Log.e(TAG + "  DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi);  
    Log.e(TAG + "  DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI);  
      
    screenWidth  = dm.widthPixels;      // 屏幕宽(像素,如:480px)  
    screenHeight = dm.heightPixels;     // 屏幕高(像素,如:800px)  
      
    Log.e(TAG + "  DisplayMetrics(111)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  
      
      
      
    // 获取屏幕密度(方法3)  
    dm = new DisplayMetrics();  
    getWindowManager().getDefaultDisplay().getMetrics(dm);  
      
    density  = dm.density;      // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)  
    densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)  
    xdpi = dm.xdpi;           
    ydpi = dm.ydpi;  
      
    Log.e(TAG + "  DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi);  
    Log.e(TAG + "  DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI);  
      
    int screenWidthDip = dm.widthPixels;        // 屏幕宽(dip,如:320dip)  
    int screenHeightDip = dm.heightPixels;      // 屏幕宽(dip,如:533dip)  
      
    Log.e(TAG + "  DisplayMetrics(222)", "screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);  
      
    screenWidth  = (int)(dm.widthPixels * density + 0.5f);      // 屏幕宽(px,如:480px)  
    screenHeight = (int)(dm.heightPixels * density + 0.5f);     // 屏幕高(px,如:800px)  
      
    Log.e(TAG + "  DisplayMetrics(222)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  
 
 
    二、图片资源方面
        1、需要根据dpi值准备5套图片资源:
        (1)drawable:主要放置xml配置文件或者对分辨率要求较低的图片
        (2)drawalbe-ldpi:低分辨率的图片,如QVGA (240x320)
        (3)drawable-mdpi:中等分辨率的图片,如HVGA (320x480)
        (4)drawable-hdpi:高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
        (5)drawable-xhdpi:至少960dp x 720dp(一般比较少用)
Android会有自动匹配机制去选择对应的布局和图片资源,系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
    
    三、动态实现的界面,样式的设定(values方面)
        不同分辨率,界面的字体大小,字体等需要不同的样式,且需要动态生成的情况下,需要把不同分辨率的配置信息保存到应用中。
    举例:在RES里创建 values-480x320 values-800x400
    并在创建的文件夹中分别创建string.xml
    <dimen name="Text_size">30px</dimen>
    在程序中直接调用R.dimen.Text_size
    
    四、最后,做一下总结:
        (1)不要使用AbsoluteLayout布局,尽量使用RelativeLayout和LinearLayout;
        (2)在使用布局的时候尽量使用权重,可以有效减少死数据的使用,降低适配的工作量。
        
----------------------------------------
(3)
密度值:
    
QVGA 和 WQVGA: density=120

HVGA : density=160

WVGA : density=240
    
    
下面以480dip*800dip的WVGA(density=240)为例,详细列出不同density下屏幕分辨率信息:
当density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)
状态栏和标题栏高各19px或者25dip
横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip
竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dip

density=160时 屏幕实际分辨率为320px*533px (3个点对应两个分辨率)
状态栏和标题栏高个25px或者25dip
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip

density=240时 屏幕实际分辨率为480px*800px (一个点对于一个分辨率)
状态栏和标题栏高个38px或者25dip
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip

apk的资源包中,当屏幕density=240时使用hdpi标签的资源
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源。
不加任何标签的资源是各种分辨率情况下共用的。
建议:布局时尽量使用单位dip,少使用px。

device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。    

(4)
dip与px的互相转换:

public static int dip2px(Context context, float dipValue){

  final float scale = context.getResources().getDisplayMetrics().density;

  return (int)(dipValue * scale + 0.5f);

  }

  public static int px2dip(Context context, float pxValue){

  final float scale = context.getResources().getDisplayMetrics().density;

  return (int)(pxValue / scale + 0.5f);

  }
(5)
要把密度无关像素转换为屏幕像素:

pixels = dips * (density / 160);


(6)

手机常见分辨率:

4:3
VGA     640*480 (Video Graphics Array)
QVGA  320*240 (Quarter VGA)
HVGA  480*320 (Half-size VGA)
SVGA  800*600 (Super VGA)

5:3
WVGA  800*480 (Wide VGA)

16:9
FWVGA 854*480 (Full Wide VGA)
HD        1920*1080 High Definition
QHD     960*540
720p    1280*720  标清
1080p  1920*1080 高清

手机:
iphone 4/4s    960*640 (3:2)
iphone5         1136*640
小米1             854*480(FWVGA)
小米2             1280*720


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值