android 不同分辨率,屏幕适应

不同分辨率下容易出现的问题

       由于目前android设备的分辨率种类很多,在开发的时候不注意进行屏幕适配的话会出现很多问题。

比如高分辨率和低分辨率下的图片显示问题,在高分辨率下显示低分辨率图片显示质量下降。还有屏幕长宽

比不同的情况下会出现布局移位,甚至是整个页面错乱的情况。还有字体设置,在不同分辨率下使用同一字

体可能会导致字体显示大小不一的情况。以上问题,有的可以通过变量使用非固定值来解决,有的可以通过

google官方提供的方法进行解决,有的则需要使用一些特殊方法来进行解决。以下是我调查的一些方法可以

供大家参考。



屏幕分辨率中的几个概念
以下是根据Google官方文档翻译过来的屏幕分辨率中的一些概念。


1.屏幕尺寸:屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如2.8寸,3.5寸)。Android把所有的屏幕尺寸简化为三大类:

大,正常,和小。程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染

到对应的屏幕上,这个过程是不需要程序员用代码来干预的。
2.  屏幕长宽比:屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源

分类符long和notlong。
3.  分辨率:屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕

长宽比。在Android系统中,程序一般并不直接处理分辨率。

4 .密度:以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的

屏幕通常则会有很多——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定

义的界面元素(比如一个按钮),在低密度的屏幕上会显得很大,但在高密度的屏幕上则会显得很小。

5.  密度无关的像素(DIP):指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程

序员构建一个布局方案(界面元素的宽度,高度,位置)。一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为160DPI

的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,

“透明地”处理所有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式:

pixels = dips * (density /160)。举个例子,在DPI为240的屏幕上,1个DIP等于1.5个物理像素。

我们强烈推荐你用DIP来定义你程序的界面布局,因为这样可以保证你的UI在各种分辨率的屏幕上都可以正常显示。



官方文档中的建议




Google官方文档中提出了一些关于屏幕分辨率适配的建议。
1  声明最小支持分辨率:在manifest文件中声明android:requiresSmallestWidthDp、android:compatibleWidthLimitDp、

android:largestWidthLimitDp,限定分辨率。
2  在分辨率中使用wrap_content, fill_parent,或者dp单位。例如,在layout_width="100dp"这个声明下,如果是中等分

辨率屏幕下代表着100个像素点宽的距离,而在高等分辨率屏幕下代表着150像素点的距离。同样的,你可以使用sp单位来定义

字体大小。
3  在代码中尽量不使用硬性定义。使用myView.getWidth()在当前屏幕下得到了10的值,但是可能在另一个屏幕下会得到15的值。

所以在代码中使用硬性定义的话,会导致屏幕不适配的问题。

4  不使用绝对布局。绝对布局是根据像素点排列的,在项目中推荐使用相对布局。
5  针对不同尺寸和不同密度采用不同的资源。尽管系统可以自动识别屏幕大小并作出资源图片的调整,如果想让图片资源保持不同

方向比例一致的话,还是在资源中添加多个资源。如果需要精确地摆放图片位置的话,建议修整图片到合适的大小,并根据图片密度

放在不同的文件夹下,例如drawable-mdpi和drawable-ldpi里



调查到的解决方法几种


以下是根据网上的一些方法总结的解决方法,都已经做过实例测试方法可用,但是没有在具体的项目中使用过,可以参考。
       在布局文件中使用weight来控制位置。将控件的layout中的width、height设置为fill-parent,不要使用

wrap-content。因为wrap-content的大小是不固定的。而weight(权重)这个属性很好的解决了这个问题。当包裹在控件

外面的Layout的width、height属性都设置为fill-parent时,可以利用weight的反比特性。即如果控件A设置weight为9,

控件B设置weight为20,那么A所占的空间为20/(9+20),B所占的空间为9/(9+20)。这样的反比属性对任何分辨率下的

手机都是合适的。

      在布局文件中使用weight也可以使用wrap-content,这时的话就是正比例计算,即如果控件A设置weight为9,

控件B设置weight为20,那么A所占的空间为9/(9+20)

      字体大小的设置。需要在res文件夹中创建一个文件夹,叫做values-1280x720。其中1280x7200是手机屏幕的分辨率,

根据手机屏幕的情况做不同的命名,一定要保留res里默认的dimens.xml文件,这样的话可以再屏幕分辨率不适应的情况下

找到字体大小。
      
      屏幕自适应可能会出现识别错误问题,加载了低分辨率图片到中分辨率手机上,这个时候也可以删除掉drawable-hdpi、

drawable-mdpi、drawable-ldpi三个文件夹,创建一个drawable文件夹即可。也可以将资源文件放入assets中,

因为assets中的资源系统永远不会为其生成id,所以不会智能缩放。还有设置最低版本,把1.5以下的版本支持去掉也可以

产生一些作用。B所占的空间为20/(9+20)。缺点是当content内容的大小特殊的情况下,这个比例不会被执行。

例如values-800x480。在该文件夹下创建一个dimens.xml文件,定义各种字体的大小。那么系统就会自动根据你手机屏幕的分辨率

去调用响应的文件夹。需要注意的是,

    一些比较极端的情况,比如1280x800 1280x768 1280x720,这里可以使用一个兼容性的布局,如果里面含有图片而且对于

宽度要求十分精确地话,建议修正图片大小或者做填充处理(在边缘为纯色的情况下将背景填充为和边缘颜色一样的色值即可)。

Android9 patch 图片 (.9.png 格式图片) 的特点和制作
一.9.png格式的文件的特点
   与传统的png 格式图片相比, 9.png 格式图片在图片四周有一圈一个像素点组成的边沿,该边沿用于对图片的可扩展区和内容

显示区进行定义。这种格式的图片在android 环境下具有自适应调节大小的能力。(1)允许开发人员定义可扩展区域,当需要延伸图

片以填充比图片本身更大区域时,可扩展区的内容被延展。(2)允许开发人员定义内容显示区,用于显示文字或其他内容. 如下图所示:

左侧和上方的黑线交叉的部分即可扩展区域,右侧和下方的黑线交叉的部分即内容显示区.

                              
二 .9.png 图片的制作
  android sdk 的 tools文件夹下提供了制作该格式图片的工具 draw9patch.bat。使用此工具打开任意图片之后,将鼠标置于图片上。
  被黑色覆盖的是不可编辑(锁住)的区域,周围的一圈一个像素的边沿是可编辑区域。按住鼠标左键,在左侧和上方的边沿画出可扩展区。

在右侧和下方画出内容显示区。完成绘制以后,选择file-> save ,即可保存为 .9.png 格式的文件,并在android项目中使用。
实际项目中,其他公司决绝方案
案例一
1.屏幕大小
  在res目录下创建不同的layout文件夹,比如:layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,

而系统会根据屏幕的大小自己选择合适的layout进行使用。


2.字体自适应大小

  首先根据不同分辨率获取不同字体大小。 
在RES里创建
values-480x320/strings.xml 里面设置<dimenname="Text_size">30px</dimen>
和 values-800x400/strings.xml 里面设置<dimenname="Text_size">30px</dimen>
分别代表480X320 和 800X400分辨率情况下 字号为30px和40px;
在java文件中这样调用:int sizeOfText = (int)this.getResources().getDimension(R.dimen.Text_size);

案例二
用密码获取屏幕宽高,根据图片原比例,在代码中自己设置高宽。
WindowManager wm = (WindowManager) this
                                .getSystemService(Context.WINDOW_SERVICE);
                width= wm.getDefaultDisplay().getWidth();// 屏幕宽度
                minHight= width * 381 / 480;
                calenderTableLayout.setMinimumHeight((int)minHight);
案例三
        做一张超大的图片,然后等比例缩小图片,来进行图片的适配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值