zoukankan      html  css  js  c++  java
  • Android 屏幕兼容性

    本文摘自 

    http://www.cnblogs.com/jiezzy/archive/2012/08/11/2633897.html?updated=1

    http://www.cnblogs.com/jiezzy/archive/2012/08/11/2633886.html

    http://blog.csdn.net/andypan1314/article/details/6632533

    http://www.cnblogs.com/jiezzy/archive/2012/06/11/2544788.html

    参考: http://developer.android.com/guide/practices/screens_support.html
     
    以下内容只是对Supporting Multiple Screens这部分文档的总结,只是对初看者启到一个提示作用,如果看完后还是不能有一个很好的理解,可以参考文档 


    基本概念 
    屏幕大小:以对角线的长度来衡量屏幕的大小 

    分辨率:屏幕上的像素个数。如320x480,就表示宽方向有320个像素,高方向有480个像素,整个屏幕有153,600个像素。 

    宽高比:宽的物理长度/高的物理长度,如:6cm/8cm。而不是用像素的比值来表示,如320/480。 

    屏幕密度:也可以是像素密度,即单位面积上存在多少个像素,单位是dpi。160dpi就是单位面积上有160个像素,240dpi就是单位面积上有240个像素。 
    屏幕的密度是由分辨率和屏幕大小(物理尺寸)决定的,320x480的分辨率在3寸的屏幕上与6寸的屏幕上密度是不同的。 
     
     
     


    dp(dpi):与像素无关的大小单位,将dp作为单位的可以看作是物理值。android将160dp作为一个标准(即单位面积上有160个像素点时),此时1dp=1px;当将1dp放到240dp的屏幕上去时,android就会自动将1dp调整为1.5px。 

    android将所有的密度泛化为:ldpi, mdpi, hdpi。将屏幕大小泛化为small, medium, large, xlarge。 

    [android <wbr>屏幕适配]Android <wbr>屏幕兼容性[转]  


    Manifest.xml中的support-screens元素 
    <support-screens 
        android:smallScreens="false" 
        android:mediumScreens="false" 
        android:largeScreens="false" 
        android:xlargeScreens="false" 
        android:anyDensity="false" 
    /> 

    anyDensity:程序是否可在任何密度的屏幕上运行。该值主要是为使用了px作为单位的程序设计的。 
    设为false时,anroid会启用density-compability特性,根据不同的屏幕密度将px值转换为合理的大小。 
    设为true时,就会关闭density-compability特性。 
    如果程序是以dp作为长度单位的,无论设为false, true都可以。 

    xxxScreens:是否支持某屏幕。 
    设为false时,表示不支持该大小的屏幕,android会启用size-compability特性,即只显示标准屏幕(normal size, mdpi)的大小。 
    设为true时,表示支持该大小的屏幕,android就不会做任何处理,将程序直接显示。 


    Manifest.xml中的uses-sdk元素 
    <uses-sdk 
        android:minSdkVersion="integer" 
        android:targetSdkVersion="integer" 
        android:maxSdkVersion="integer" 
    /> 
    minSdkVersion:标识程序可以在低版本的andriod系统上运行,且最低的版本是多少。默认时为1 

    targetSdkVersion:该值主要是会影响support-screens元素中的属性的默认值。 

    maxSdkVersion:程序最高可运行在什么版本的android系统上,该属性一般不需要设置,android 2.0.1之后,android也不会去检查该属性,只有android market才会用到。 


    android为兼容多分辨率提供的兼容特性 
    density-compatibility: 
    1. dp,密度无关的单位 
    2. 根据屏幕密度将px转换为合理的值 
    3. pre-scale bitmap,根据当前的屏幕,从具有相应后缀的资源目录中加载资源(如:drawable-hdpi);同时,在相应后缀中无法找到指定资源时,就加载默认资源目录(drawable或drawable-mdpi)中的资源,并进行相应的缩放。 
    4. auto-scale bitmap,自己创建bitmap时,android会为对其进行缩放。 

    size-compatibility: 
    在support-screens的xxxScreen属性设为false,就会启用该特性。就是当程序运行在大屏幕上时,还是以正常屏幕的大小显示,其余的部分留黑。 


    屏幕密度,分辨率等数据获取和转换 

    Java代码  收藏代码
    1. DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();  
    2.   
    3. displayMetrics.density; // density比例,160dpi的为1,240dpi的为1.5(以160dpi为标准,240/160dpi)  
    4.   
    5. displayMetrics.densityDpi; // 屏幕密度。160dpi,240dpi等  
    6. displayMetrics.scaledDensity; // 字体缩放比例  
    7.   
    8. displayMetrics.heightPixels; // 高上有多少个像素  
    9. displayMetrics.widthPixels; // 宽上有多少个像素  
    10.   
    11. displayMetrics.xdpi; // 以dp值来表示的宽  
    12. displayMetrics.ydpi; // 以dp值来表示的高 

     
     
     
     
    如 果你已经发布过针对Android 1.5或更早版本平台的程序,你应该仔细阅读这篇文档,然后考虑一下到底如何让自己的老程序可以在拥有各种不同分辨率,并且运行着Android 1.6或更新平台上正常显示。在绝大部分情况下,只需要对程序作出小小的修改就可以达到目的,但你仍然需要尽可能地在各种分辨率的平台上进行测试。
      特别的,如果你有一个已经完成的程序,又想让它可以在超低分辨率的设备(比如320×240)上正确运行,你需要阅读“老程序的更新策略”,那篇文档会告诉你应该怎么做。

    术语和概念
    屏幕尺寸
    屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如2.8寸,3.5寸)。
    简而言之,Android把所有的屏幕尺寸简化为四类:超大、大、正常、小。 (small, normal, large, and extra large.)
    程序可以针对这四种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。

    屏幕密度

    物 理屏幕上的像素总数。与尺寸类似,也有四种: 低、中、高、超高。 ( low, medium, high, and extra high.) 密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多——甚至会非常非常多——像素排列在同一区域。屏幕的密度 是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会显得很大,但在高密度的屏幕上则会显得很小。

    屏幕长宽比
    屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和notlong。

    分辨率
    屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在Android系统中,程序一般并不直接处理分辨率。


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


    支持的屏幕分辨率范围
    1.5及更早版本的Android系统,在设计的时候假定系统只会运行在一种分辨率的设备上——HVGA(320×480)分辨率,尺寸为3.2寸。由于系统只能工作在一种屏幕上,开发人员就可以针对那个屏幕来编写自己的程序,而无需去考虑程序在其他屏幕上的显示问题。
    但自从Android 1.6以来,系统引入了对多种尺寸、多种分辨率屏幕的支持,以此满足拥有各种配置的新平台的运行需求。这就意味着开发人员在针对Android 1.6或更新版系统开发程序的时候,需要为自己的程序在多种分辨率的屏幕上良好显示作出额外的设计。
    为了简化程序员面在对各种分辨率时的困扰,也为了具备各种分辨率的平台都可以直接运行这些程序,Android平台将所有的屏幕以密度和分辨率为分类方式,各自分成了四类:
    ·四种主要的尺寸:超大、大,正常,小;
    ·四种不同的密度:超高、高(hdpi),中(mdpi)和低(ldpi)。
    如 果需要的话,程序可以为各种尺寸的屏幕提供不同的资源(主要是布局),也可以为各种密度的屏幕提供不同的资源(主要是位图)。除此以外,程序不需要针对屏 幕的尺寸或者密度作出任何额外的处理。在执行的时候,平台会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界 面布局)转换成屏幕上的物理像素。

    下表列出了Android平台支持的屏幕中一些比较常用的型号,并显示了系统是如何把它们分类到不同的屏幕配置里的。有些屏幕分辨率并不在下面的列表上,但系统仍会把它们归入下列的某一个类型中。




    虽 然系统支持上面多种不同配置的屏幕,但你并不一定需要为它们都提供各自不同的资源。系统已经提供了足够鲁棒(就是在各种恶劣环境下正常工作,对环境变化不 敏感)的兼容特性,用于在各种不同的屏幕上良好显示你的程序。这在下面的文档中会详细描述,如果你需要更多的资料,请查看“与屏幕无关的最佳实践”。

  • 相关阅读:
    架构设计流程:评估和选择备选方案
    架构设计流程:设计备选方案
    架构设计三原则
    迭代器模式(电视机遥控器)
    外观模式
    5.组合模式
    完成动物识别,自行拍摄动物图片进行上传并查看结果
    4.桥接模式 (毛笔和颜色)
    企业沟通机制
    完成植物识别,自行拍摄植物图片进行上传并查看结果
  • 原文地址:https://www.cnblogs.com/jiezzy/p/2554931.html
Copyright © 2011-2022 走看看