涉及Android手机屏幕适配的相关知识

  昨天上班的时候无意间发现了个问题。在我做的项目里,需要自定义重写的框架有很多,对触摸事件要求很高。在自己的几个手机上测试一切正常,然后拿了同事新买的一只比较好的手机测试,发现,字体明显比我手机小了很多,这还不是什么严重的问题,重点是,我明明是点击,它却认为我是在滑动!让我瞬间想感叹:天哪噜!这手机的分辨率是有多高!

  分析下来,这现象就因为一句判断它为挪动的语句上出了问题。很low的我,在代码中是设定的死值,只要手指滑动超过了25个像素点,我就把它判为滑动。所以在一个分辨率极高的手机上就完犊子了。

  因此,我决定要把这个很蠢的定值给换掉,于是就用了屏幕密度来做了这个数值的控制,代码是非常的简单,我就不粘出来了,但是我意识到手机频幕像素适配的重要性。于是决定趁着因为双十一壕的太猛被爹妈禁足的时间来好好学习一下频幕适配相关知识(壕的是我妈的钱,我依旧那么富有,哈哈哈哈哈哈哈)。


  首先,需要理清一些术语及常见度量单位

Density 屏幕密度:屏幕的屋里面积内的像素数量,通常指dpi(每英寸点数)

Resolution 分辨率:在屏幕上的像素总数。

dp(与密度无关的像素,独立像素密度) Density-independent pixel:在定义UI布局时应该使用的虚拟像素单元,它用一种密度无关的方式来表达布局尺寸或位置。

px(像素):屏幕上的点,绝对长度,与硬件相关。

in(英寸):长度单位。[ 1英寸(in)=2.54厘米(cm) ]

dip:Dots Per Inch,每英寸所打印的点数(密度)。

sp:scaled pixels(放大像素)。主要用于字体显示best for textsize。


  那么接下来就跟着我偶像——张鸿洋大神的《Android 屏幕适配方案》开启学习路程。

  在安卓中,px = dp * (dpi / 160),以160dip(1英寸160个像素点)为标准,即1dp对应1个pixel(px),计算公式如:屏幕密度越大(dip越大),那么一个像素点对应的dp越小,反过来说就是1dp对应的像素点越多。

  从上面的分析中,简而易见。dp,脱离了像素的限制,是解决屏幕适配问题的希望。然而,现实很残酷,为4.3寸屏幕准备的UI,运行在5.0寸的屏幕上,很可能在右侧和下侧存在大量的空白。而5.0寸的UI运行到4.3寸的设备上,很可能显示不下。这么情况下,dp就显得无能为力了。

  总结:dp能够让同一数值在不同的分辨率展示出大致相同的尺寸大小。但是当设备的尺寸差异较大的时候,就无能为力了。

  在大神文中提到了两个解决这个适配问题的方案:
  一个就是Android-percent-support这个库!按百分比来布局。
  还有一个就是,在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹(dimens.xml文件,目前我搜到的字体适配方案只有这一个)。

  这两个等我有空了自己测试一下,今天就对手机屏幕适配做个了解。


  此外,屏幕适配还需要注意的事项:

1、AndroidManifest.xml设置

  在中Menifest中添加子元素android:anyDensity=”true”时,应用程序安装在不同密度的终端上时,程序会分别加载xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夹中的资源。
  相反,如果设为false,即使在文件夹下拥有相同资源,应用不会自动地去相应文件夹下寻找资源:
  1) 如果drawable-hdpi、drawable-mdpi、drawable-ldpi三个文件夹中有同一张图片资源的不同密度表示,那么系统会去加载drawable_mdpi文件夹中的资源;
  2) 如果drawable-hpdi中有高密度图片,其它两个文件夹中没有对应图片资源,那么系统会去加载drawable-hdpi中的资源,其他同理;
  3) 如果drawable-hdpi,drawable-mdpi中有图片资源,drawable-ldpi中没有,系统会加载drawable-mdpi中的资源,其他同理,使用最接近的密度级别。

2、横屏竖屏目录区分

1) drawable
  a) drawable-hdpi该图片即适用于横屏,也适用于竖屏;
  b) drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹的资源;
  c) drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资源。其他同理。
  
2) layout
  在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。

你可能感兴趣的:(ゝω・Android学习笔记)