虽然Android
提供了很多中布局方式,但是我们经常用的就三个: LinearLayout
, RelativeLayout
和FrameLayout
。
但是在使用RelativeLayout
和FrameLayout
的时候又会存在这样的问题。当我们需要指定子布局占父布局的百分比时,只有两种方式:
- 在里面添加
LinearLayout
使用layout_weight
- 在
java
代码中重写onMeasure
等。
例如:当我需要指定左边距为父布局的 5%,宽度为父布局的 25%
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="20">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
/>
<View
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="5"
android:background="#ff0000" />
</LinearLayout>
</RelativeLayout>
此时你会发现布局文件变的复杂了好多,也是增加布局的绘制时间。
现在这个已经不是个问题了,在最新发布的Support Library
增加在RelativeLayout
和FrameLayout
的%属性。
Percent Support Library
首先你需要升级你的支持库到 23,因为是在这个版本发布的,然后添加依赖在你的build.gradle
文件中:
com.android.support:percent:23.0.0'
使用 android.support.percent.PercentRelativeLayout
和 android.support.percent.PercentFrameLayout
分别替代掉 RelativeLayout
和FrameLayout
。现在有 9个属性可以使用
- layout_widthPercent : 宽度的百分比 ,例如:app:layout_widthPercent="25%"
- layout_heightPercent : 高度的百分比
- layout_marginPercent : 边距的百分比
还其他一些layout_marginLeftPercent, layout_marginRightPercent, layout_marginTopPercent, layout_marginBottomPercent, layout_marginStartPercent, layout_marginEndPercent
现在我们重写一下上面的例子:
<android.support.percent.PercentRelativeLayout 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">
<View
app:layout_widthPercent="25%"
android:layout_height="100dp"
app:layout_marginLeftPercent="5%"
android:background="#ff0000" />
</android.support.percent.PercentRelativeLayout>
两个结果对比:
你会发现结果完全一致,但是代码更简洁,没有添加任何填充的布局,会更好的执行。
来源:https://inthecheesefactory.com/blog/know-percent-support-library/en
Note:这个是一篇以前翻译的文章,博客挂了,恢复到这边。