由于Android碎片化严重,屏幕适配一直是开发中较为头疼的问题。面对市面上五花八门的屏幕大小与分辨率,Android基于dp与res目录名称来适配的方案已无法满足一次编写全屏幕适配的需求,为了达到最优的视觉效果,开发过程中总是需要花费较多资源进行适配。也有开发者给出了一些自己的解决方案。
使用姿势:
-
核心。使用冷门的pt作为长度单位,按照上述想法将其重定义为与屏幕大小相关的相对单位,不会对dp等常用单位的使用造成影响。
-
绘制。编写xml时完全对照设计稿上的尺寸来编写,只不过单位换为pt。假如设计图宽度为200,一个控件在设计图上标注的长度为3,只需要在初始化时定义宽度为200,绘制该控件时长度写为3pt,那么在任何大小的屏幕上该控件所表现的长度都为屏幕宽度的3/200。如果需要在代码中动态转换成px的话,使用
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, value, metrics)
。 -
预览。实时预览时绘制页面是很重要的一个环节。以1334x750的设计图为例,为了实现于正常绘制时一样的预览功能,创建一个长为1334磅,宽为750磅的设备作为预览,经换算约为21.5英寸(
(sqrt(1334^2+750^2))/72
)。预览时选择这个设备即可。
使用方法:
在build.gradle中加入依赖:
compile 'com.bulong.rudeness:rudeness:latest.release@aar'
在Application的onCreate中引用:
//设计图标注的宽度int designWidth = 750;new RudenessScreenHelper(this, designWidth).activate();这样绘制出来的页面就跟设计图几乎完全一样,无论大小屏上看起来就只是将设计图缩放之后的结果。
SDK API Refrences:
public class RudenessScreenHelper { /** * 转换dp为px * @param context context * @param value 需要转换的dp值 * @return px值 */ public static float dp2px(Context context, float value); /** * 转换pt为px * @param context context * @param value 需要转换的pt值,若context.resources.displayMetrics经过resetDensity()的修改则得到修正的相对长度,否则得到原生的磅 * @return px值 */ public static float pt2px(Context context, float value); /** * 构造方法 * @param application application * @param width 设计稿宽度 */ public RudenessScreenHelper(Application application, float width); /** * 激活本方案 */ public void activate(); /** * 恢复系统原生方案 */ public void inactivate(); }
原文链接请
戳这里
、、