由于 Android 系统的开放性,任何用户、开发者、OEM 厂商、运营商都可以对 Android 进行定制,于是导致:
据友盟指数显示,统计至 2015 年 12 月,支持 Android 的设备共有 27796 种。当 Android 系统、屏幕尺寸、屏幕密度出现碎片化的时候,就很容易出现同一元素在不同手机上显示不同的问题。 这样可以最大程度优化所有设备上的用户体验,用户会认为您的应用实际上是专为他们的设备而设计,而不是简单地拉伸以适应其设备屏幕。 二、相关概念1. 屏幕尺寸
2. 分辨率
3. 屏幕像素密度
安卓手机对于每类手机屏幕大小都有一个相应的屏幕像素密度:
4. 屏幕尺寸、分辨率、像素密度三者关系一部手机的分辨率是宽 x 高,屏幕大小是以寸为单位,那么三者的关系是: 5. 密度无关像素 (dp)
因为 UI 设计师给你的设计图是以 px 为单位的,Android 开发则是使用 dp 作为单位的,那么我们需要进行转换:
在 Android 中,规定以 160dpi(即屏幕分辨率为 320x480)为基准:1dp=1px 6. 独立比例像素
Android 开发时用此单位设置文字大小,可根据字体大小首选项进行缩放。 推荐使用 12sp、14sp、18sp、22sp 作为字体设置的大小,不推荐使用奇数和小数,容易造成精度的丢失问题;小于 12sp 的字体会太小导致用户看不清。 三、如何适配1. 布局适配使用相对布局(RelativeLayout),禁用绝对布局(AbsoluteLayout)开发中,我们使用的布局一般有:
布局的子控件之间使用相对位置的方式排列,因为 RelativeLayout 讲究的是相对位置,即使屏幕的大小改变,视图之前的相对位置都不会变化,与屏幕大小无关,灵活性很强
通过多层嵌套 LinearLayout 和组合使用“wrap_content”和“match_parent”已经可以构建出足够复杂的布局。但是 LinearLayout 无法准确地控制子视图之间的位置关系,只能简单的一个挨着一个地排列。 所以,对于屏幕适配来说,使用相对布局(RelativeLayout)将会是更好的解决方案。 根据屏幕的配置来加载相应的 UI 布局最小宽度(Smallest-width)限定符 在 Android 3.2 及之后版本,引入了最小宽度(Smallest-width)限定符
代码展示:(1)适配手机的单面板(默认)布局:res/layout/main.xml <LinearLayout xmlns:android="http://schemas./apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/headlines" android:layout_height="fill_parent" android:name="com.example.android.newsreader.HeadlinesFragment" android:layout_width="match_parent" /></LinearLayout> (2)适配尺寸>7 寸平板的双面板布局:res/layout-sw600dp/main.xml <LinearLayout xmlns:android="http://schemas./apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <fragment android:id="@+id/headlines" android:layout_height="fill_parent" android:name="com.example.android.newsreader.HeadlinesFragment" android:layout_width="400dp" android:layout_marginRight="10dp"/> <fragment android:id="@+id/article" android:layout_height="fill_parent" android:name="com.example.android.newsreader.ArticleFragment" android:layout_width="fill_parent" /></LinearLayout>
2. 布局组件适配本质:使得布局组件自适应屏幕尺寸
通过使用”wrap_content”、”match_parent”和”weight”来替代硬编码的方式定义视图大小&位置,你的视图要么仅仅使用了需要的那边一点空间,要么就会充满所有可用的空间,即按需占据空间大小,能让你的布局元素充分适应你的屏幕尺寸。 3. 图片资源适配本质:使得图片资源在不同屏幕密度上显示相同的像素效果
4. 进行屏幕密度匹配“布局控件”匹配本质:使得布局组件在不同屏幕密度上显示相同的像素效果
相关概念介绍: (1)密度无关像素
在 Android 中,规定以 160dpi(即屏幕分辨率为 320x480)为基准:1dp=1px
(2)独立比例像素
所以,为了能够进行不同屏幕像素密度的匹配,我们推荐:
可是,请看以下一种场景:
从上面可以看出,由于 Android 屏幕设备的多样性,如果使用 dp 来作为度量单位,并不是所有的屏幕的宽度都具备相同的 dp 长度
所以说,dp 解决了同一数值在不同分辨率中展示相同尺寸大小的问题(即屏幕像素密度匹配问题),但却没有解决设备尺寸大小匹配的问题。(即屏幕尺寸匹配问题)
“图片资源”匹配
即一套分辨率=一套位图资源(这个当然是 Ui 设计师做了)
更好的方案解决“图片资源”适配问题上述方案是常见的一种方案,这固然是一种解决办法,但缺点在于:
那么,有没有一种方法:
方法介绍先来理解下 Android 加载资源过程: Android SDK 会根据屏幕密度自动选择对应的资源文件进行渲染加载(自动渲染)。比如说,SDK 检测到你手机的分辨率是 320x480(dpi=160),会优先到 drawable-mdpi 文件夹下找对应的图片资源;但假设你只在 xhpdi 文件夹下有对应的图片资源文件(mdpi 文件夹是空的),那么 SDK 会去 xhpdi 文件夹找到相应的图片资源文件,然后将原有大像素的图片自动缩放成小像素的图片,于是大像素的图片照样可以在小像素分辨率的手机上正常显示。 具体请看:http://blog.csdn.net/xiebudong/article/details/37040263 所以理论上来说只需要提供一种分辨率规格的图片资源就可以了。 那么应该提供哪种分辨率规格呢? 如果只提供 ldpi 规格的图片,对于大分辨率(xdpi、xxdpi)的手机如果把图片放大就会不清晰。所以需要提供一套你需要支持的最大 dpi 分辨率规格的图片资源,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。 那么这一套最大 dpi 分辨率规格应该是哪种呢?是现在市面手机分辨率最大可达到 1080X1920 的分辨率(dpi=xxdpi=480)吗? xhdpi 应该是首选。原因如下:
设计师们一般都会用最新的 iPhone6 和 iPhone5s(5s 和 5 的尺寸以及分辨率都一样)来做原型设计,所有参数请看下方:
iPhone 主流的屏幕 dpi 约等于 320, 刚好属于 xhdpi,所以选择 xhdpi 作为唯一一套 dpi 图片资源,可以让设计师不用专门为 Android 端切图,直接把 iPhone 的那一套切好的图片资源放入 drawable-xhdpi 文件夹里就好,这样大大减少的设计师的工作量! 参考链接 |
|
来自: 流曲频阳 > 《Android开发》