Android屏幕适配解析

来源:互联网 发布:java编程大赛题目 编辑:程序博客网 时间:2024/05/20 03:47

 1、屏幕支持API

              是Android 3.2值得重点关注的内容。google在此专门对平板的屏幕支持进行了扩展。另外,增加对高分辨率电视显示的支持。由此,可以看出,未来的Android除了布局智能机和平板外,同时看好智能电视以及相关的大屏幕显示设备。为了支持大屏幕和高分辨率,Android 3.2引入了质量资格,我将其理解为为了更好的在目标屏幕上进行界面布局,而引入的用来指定显示空间门槛。进而引出另外两个概念:smallestWidth(swNNNdp)、屏幕的width(wNNNdp)和height(hNNNdp)。前者指的是屏幕可绘制区域的宽度和高度中最小的那个(会把电视的高度当做宽度来使用),是屏幕的固定属性,与显示方向无关(不去关心屏幕的显示方向)。后者指的就是屏幕的可绘制区域,二者随着屏幕的显示方向不同,进行相应的切换。Android 3.2中可用的新的质量资格使用示例:


[html] view plaincopy
  1. res/layout/main_activity.xml   # For phones  
  2. res/layout-sw600dp/main_activity.xml   # For 7” tablets  
  3. res/layout-sw720dp/main_activity.xml   # For 10” tablets  
  4. res/layout-w600dp/main_activity.xml   # Multi-pane when enough width  宽度大于600DP
  5. res/layout-sw600dp-w720dp/main_activity.xml   # For large width 


例二:宽度1280*800的平板

在资源:value-w1280dp,value-w800dp,时,横屏下使用value-w1280dp的资源,竖屏使用value-w800dp的资源。

在资源:value-sw800dp,value-sw1080dp时,横屏下使用value-sw800dp的资源,竖屏下仍然使用value-sw800dp的资源。

在上诉四中资源同时存在,则优先采用sw资源,value-sw800dp



有些电视设备对于sw和w的支持并不是很好,比如联想电视,1920*1080,mdpi的设备,当values-sw1080、values-sw1080-mdpi、values-sw1080-hdpi同时存在时,会默认采用values-sw1080-hdpi的值,在只有values、values-mdpi、values-hdpi时,会采用values-mdpi下面的值。

建议:具体的设备适配的时候还是先测试下采用什么下面的值。




一些经典屏幕的dp。

  • 320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
  • 480dp: a tweener tablet like the Streak (480x800 mdpi).
  • 600dp: a 7” tablet (600x1024 mdpi).
  • 720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).


dp和像素之间的转换关系。

mdpi时1像素=1dp,;  hdpi时,1.5像素=1dp

获取屏幕像素和dp的方法。

        TextView t = new TextView(this);        t.setText("分辨率:"+getString(R.string.test));                     // 方法1 Android获得屏幕的宽和高        int screenWidth;        int screenHeight;         WindowManager windowManager = getWindowManager();        Display display = windowManager.getDefaultDisplay();        screenWidth = display.getWidth();        screenHeight = display.getHeight();         // 方法2        DisplayMetrics dm = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(dm);         //获得手机的宽度和高度像素单位为px        String str = "\n 方法1 手机屏幕分辨率为:" + screenWidth +" * "+ screenHeight + "/n方法2  手机屏幕分辨率为:" + dm.widthPixels +" * "+ dm.heightPixels;                        final float scale = this.getResources().getDisplayMetrics().density;                t.setText(t.getText()+str + "\n密度:"+scale +"dip:"+px2dip(this, screenWidth));                setContentView(t);


如果布局采用layout-sw720dp ,layout-sw1280dp等根据屏幕的分辨率来适配的,则布局属性应采用px像素值来决定而不是采用dp单位

如果布局采用layout-hdpi,layout-mdpi,layout-ldpi根据屏幕的dpi来适配的,则布局属性应采用dp单位。


更多的请参考:http://developer.android.com/guide/practices/screens_support.html#density-independence