一直以来都用px映射表来解决不同界面的适配性问题(参考:Android界面开发精要1:尺寸)。最近在一些设备上发现,这种方案也有弊端:以UI图的基础设计是基于720*1280(如Galaxy Nexus)为例,最近发现有些设备的像素宽高比并不是如此,比如Nexus 4就是768*1280。
720*1280在Galaxy Nexus上这种情形下,不同的映射方式会有不同的效果:
-
采用Google提供的dp映射:就会发现空白区域变多,原本720的宽度应该是满屏,现在就无法满屏了,因为多出了48
720*1280在Nexus 4上 -
采用百分比来映射拉伸:会发现正方形的图片,变成了长方形。因为宽度和高度的比例变了,基于其推算出来的正方形宽高自然也就不准了。
仔细思考就会发现问题的本质是:控件宽高计算基准是不同的。
- “分辨率不同啊,不单独适配了,直接拉伸好了”。这个视角是百分比视角,子控件的宽高随着父容器的宽高按照比例变动。最大的父容器就是设备的宽高。
- “我的头像明明是正方形,怎么变长了?”。这是视角是控件视角,其约束条件为 控件的宽等于高。
这让我想起iOS开发中,其界面设计系统AutoLayout,就采用了一个计算公式:
A = B*ratio+constant
A——某控件的宽、高、四周边距等
B——{另一个控件 或者 设备本身} 的宽、高、四周边距等
也就是说,任何控件都可以以其他控件的属性值来定义自身的属性值,所以其可塑性非常高。不过实际应用中也会带来一个问题,就是太灵活,导致多重约束,有时候会彼此冲突。
仔细想想,最常见的视角参数应该就只有3个:
- 设备的宽高。
- 父容器的宽高。
- 自身的宽高比例。
透过这3个参数,应该可以定义任意控件的属性值。
现在问题来了,Android怎么做到呢?答案是:****android-percent-support-extend****
android-percent-support-extend使用流程
- 添加引用
compile 'com.zhy:percent-support-extends:1.1.1'
- 用指定控件代替原有布局空间
- com.zhy.android.percent.support.PercentLinearLayout
- com.zhy.android.percent.support.PercentRelativeLayout
- com.zhy.android.percent.support.PercentFrameLayout
- 使用新的属性值来指定约束
- layout_heightPercent
- layout_widthPercent
- layout_marginBottomPercent
- layout_marginEndPercent
- layout_marginLeftPercent
- layout_marginPercent
- layout_marginRightPercent
- layout_marginStartPercent
- layout_marginTopPercent
- layout_textSizePercent
- layout_maxWidthPercent
- layout_maxHeightPercent
- layout_minWidthPercent
- layout_minHeightPercent
- layout_paddingPercent
- layout_paddingTopPercent
- layout_paddingBottomPercent
- layout_paddingLeftPercent
- layout_paddingRightPercent
对于值可以取:10%w , 10%h , 10% , 10%sw , 10%sh,缩写含义为
- w:父容器宽度
- h:父容器高度
- sw:设备宽度
- sh:设备高度
android-percent-support-extend效果
对于一开始的界面,最后xml文件为:
<?xml version="1.0" encoding="utf-8"?>
<com.zhy.android.percent.support.PercentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="#ff7ecc16"
android:gravity="center"
android:text="100%w*match_parent"
app:layout_widthPercent="100%w" />
<TextView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_gravity="bottom|right"
android:layout_margin="30dp"
android:background="#ffff0000"
android:gravity="center"
android:text="28%w*28%w"
app:layout_widthPercent="28%w"
app:layout_heightPercent="28%w"/>
</com.zhy.android.percent.support.PercentFrameLayout>
效果如下:
反思
这种直接裸写百分比的方式比价繁琐,相较之下,目前采用px映射表的方案中写的px值直接在UI设计图中取就行,更加简单。
其实px映射表方案也就是百分比的方案,而且x值和y值已经分开,所以也可以解决正方形变形的问题。
目前需要客服的问题主要在于px映射为px,导致如果没有覆盖到设备的分辨率,就会出现问题,改成px映射为dp后,这种问题应该会减少很多。
拓展阅读
Panda
2016-11-29
网友评论