在看到本文之前,如果读者没看过笔者的前文Android屏幕适配知识和Android屏幕适配(二),请先翻阅。
三、自动拉伸位图详解
.9图的使用注意事项:
1、在图的L边和U边选取伸缩点时,要注意所选择的伸缩点在水平线上(L边的点)和垂直线上(U边的点)不能经过“不想改变的图案”,否则图案将会被伸缩变形。
2、要想图案的垂直位置在伸缩后不发生改变,则需要在L边以图案为中心轴,上下各取一个点。若想水平位置在伸缩后不发生改变,则需在U边进行相同的操作。
3、在L边和T边上选取了点,即会对L边所选取的点的水平线进行伸缩,U边也类似。值得注意的是,选取的点的数量越大,伸缩效果会随数目的增加而翻倍,在做位置对称时尤其要注意。
4、R边和B边的画线,是调整内容区域的padding属性,控制内容区域与各边的距离。值得注意的是,这个调整可能会因padding属性调整过度,导致内容无法显示在窗口中,而在Android Studio中的预览窗口是无法正确显示.9图的实际效果,需要实际运行查看。
支持各种屏幕密度:
1、使用非密度制约像素(dp、sp)
即使使用dp为单位,但由于各种设备的dp总数不一样,在显示上也会造成细微的差别。为了解决以上问题,可自定义资源文件,自定义单位长度,均分设备像素。
以分辨率为480*320的设备为例,把纵向像素划分为480等份:
<?xml version="1.0" encoding="utf-8">
<resources>
<dimen name="y1">1.0px</dimen>
...
</resources>
以分辨率为480*320的设备像素划分为基准,即把横向像素划分为320等份,把纵向像素划分为480等份。
再看看分辨率为1920*1080的设备例子,把横向像素划分为320等份:
<?xml version="1.0" encoding="utf-8">
<resources>
<dimen name="x1">3.37px</dimen>
<dimen name="x2">6.75px</dimen>
...
</resources>
因此,可统一用x1x320,y1y480来代替原来的dp单位,实现全适配。
以Android Studio为例,分辨率为480*320的资源文件应放在res/values-480x320文件夹中,同理分辨率为1920*1080的资源文件应放在res/values-1920x1080文件夹中。其中values-480x320是分辨率限定符。
值得注意的是,为了实现全适配,在values文件夹中,应添加默认的资源文件,否则当设备找不到对应的资源文件时,就会报错。
<?xml version="1.0" encoding="utf-8">
<resources>
<dimen name="x1">1.0dp</dimen>
<dimen name="x2">2.0dp</dimen>
...
</resources>
注意对应单位改为dp,而不同于上面的px。
这种方式的缺点,就是要为尽可能多的设备维护一套资源文件。
2、提供备用位图
把资源图片按照2:3:4:6:8比例进行放缩,分辨放在drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi文件夹中。
为什么要这么做?读者可以做一个测试,如果只用一张资源图片,依次把资源图片放置在以上文件夹中,观察Android Studio中Memory的显示变化。
会发现运行APP所占的内存会产生变化,举个例子:
如果现在运行在xxhdpi的设备上,且资源图片放置在drawable-xxhdpi中,资源图片会占用内存7.8M(视具体图片而定),而把资源图片放置在drawable-mdpi中,资源图片会占用内存71.1M。
前面已经提到,mdpi资源图片:xxhdpi资源图片 = 2:6 = 1:3的关系,而占用的内存比大约为:12:32 = 1:9,由此可知,不提供备用位图,会因为图片的伸缩适配问题,造成占用内存的增大。
因此,笔者建议读者尽可能地按比例进行切图,以减少手机运行APP的压力
实施自适应用户界面流程:
1、确定当前布局(根据resources的bool判断)
2、根据当前布局做出响应
3、重复使用其他活动中的片段(对Fragment进行复用)
4、处理屏幕配置变化(如平板从横向变竖向,其Activity需重新跑一次生命周期,以切换成新的布局)
关于高清设计图尺寸:
优先设计高分辨率的原图
网友评论