百分比布局适配百分比布局适配
文章目录文章目录一、简述二、google推荐的百分比布局的使用方式三、实现3.1 创建属性文件3.2 解析3.3 计算并设置百分比布局四、
使用五、完整代码六、注意
一、简述一、简述
百分比布局适配,就是以父容器的尺寸作为基准,在view的加载过程中,根据当前父容器实际尺寸换算出目标尺寸,再作用在
view上。
百分比布局,实际是对容器的一种扩展,即对宽高百分比的设置。
二、二、google推荐的百分比布局的使用方式推荐的百分比布局的使用方式
首先要引入:implementation ‘com.android.support:percent:28.0.0’
然后将布局引用为:android.support.percent.PercentRelativeLayout
给控件设置:app:layout_widthPercent=“50%”
百分比布局,实际是对容器的一种扩展,即对宽高百分比的设置。
三、实现三、实现
3.1 创建属性文件创建属性文件
attrs.xml中来定义必备的属性
3.2 解析解析
解析在哪做?以RelativeLayout为例,重要属性都封装在静态类LayoutParams中。这个静态类中就定义了一些自定义属性,
也是RelativeLayout特有的属性(相对布局中的独有属性,不能作用于线性布局中):
public LayoutParams(Context c, AttributeSet attrs) {
super(c, attrs);
TypedArray a = c.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.RelativeLayout_Layout);
final int targetSdkVersion = c.getApplicationInfo().targetSdkVersion;
mIsRtlCompatibilityMode = (targetSdkVersion < JELLY_BEAN_MR1 ||
!c.getApplicationInfo().hasRtlSupport());
final int[] rules = mRules;
//noinspection MismatchedReadAndWriteOfArray
final int[] initialRules = mInitialRules;
final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = a.getIndex(i);
switch (attr) {
case com.android.internal.R.styleable.RelativeLayout_Layout_layout_alignWithParentIfMissing:
alignWithParent = a.getBoolean(attr, false);
break;
case com.android.internal.R.styleable.RelativeLayout_Layout_layout_toLeftOf:
rules[LEFT_OF] = a.getResourceId(attr, 0);
break;
case com.android.internal.R.styleable.RelativeLayout_Layout_layout_toRightOf:
rules[RIGHT_OF] = a.getResourceId(attr, 0);
break;
case com.android.internal.R.styleable.RelativeLayout_Layout_layout_above:
rules[ABOVE] = a.getResourceId(attr, 0);
break;
case com.android.internal.R.styleable.RelativeLayout_Layout_layout_below:
rules[BELOW] = a.getResourceId(attr, 0);
break;
case com.android.internal.R.styleable.RelativeLayout_Layout_layout_alignBaseline:
rules[ALIGN_BASELINE] = a.getResourceId(attr, 0);
break;
case com.android.internal.R.styleable.RelativeLayout_Layout_layout_alignLeft:
rules[ALIGN_LEFT] = a.getResourceId(attr, 0);
break;
case com.android.internal.R.styleable.RelativeLayout_Layout_layout_alignTop:
rules[ALIGN_TOP] = a.getResourceId(attr, 0);