Android5.X之PercentLayout

来源:互联网 发布:黑龙江省统计局数据 编辑:程序博客网 时间:2024/06/05 19:02

引入依赖库

compile 'com.android.support:percent:24.x.x'

主要类

  • PercentRelativeLayout(继承自RelativeLayout)
  • PercentFrameLayout(继承自FrameLayout )

属性

  • layout_widthPercent 设置控件宽度为父容器的宽的百分比
  • layout_heightPercent 设置控件高度为父容器的高的百分比
  • layout_marginPercent 设置控件外边距为父容器的宽度的百分比
  • layout_marginLeftPercent 设置控件与左边控件的距离为父容器的宽度的百分比
  • layout_marginTopPercent 设置控件与上方控件的距离为父容器的高度的百分比
  • layout_marginRightPercent 设置控件与右边控件的距离为父容器的宽度的百分比
  • layout_marginBottomPercent 设置控件与下方控件的距离为父容器的高度的百分比
  • layout_marginStartPercent
  • layout_marginEndPercent

原来用某些具体单位(如dp)的设置现在都可以用百分比的方式进行设置了,例如设置控件的宽度layout_width原来我们是这样玩的android:layout_width="match_parent"现在用了百分比的属性之后呢,可以这样玩了app:layout_widthPercent="50%",这里的百分比是相对于父容器而言的。

具体使用

xml文件加入命名空间

xmlns:app="http://schemas.android.com/apk/res-auto"
<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"/>      <ImageView        android:layout_width="0dp"        android:layout_height="0dp"        app:layout_widthPercent="50%"        app:layout_heightPercent="50%"        app:layout_marginTopPercent="25%"        app:layout_marginLeftPercent="25%"/>  </android.support.percent.PercentRelativeLayout/>

自定义PecentLinearLayout

库中并没有提供PecentLinearLayout,想玩PecentLinearLayout就需要自定义了

public class PercentLinearLayout extends LinearLayout{    private PercentLayoutHelper mPercentLayoutHelper;    public PercentLinearLayout(Context context, AttributeSet attrs)    {        super(context, attrs);        mPercentLayoutHelper = new PercentLayoutHelper(this);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)    {        mPercentLayoutHelper.adjustChildren(widthMeasureSpec, heightMeasureSpec);        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        if (mPercentLayoutHelper.handleMeasuredStateTooSmall())        {            super.onMeasure(widthMeasureSpec, heightMeasureSpec);        }    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b)    {        super.onLayout(changed, l, t, r, b);        mPercentLayoutHelper.restoreOriginalParams();    }    @Override    public LayoutParams generateLayoutParams(AttributeSet attrs)    {        return new LayoutParams(getContext(), attrs);    }    public static class LayoutParams extends LinearLayout.LayoutParams            implements PercentLayoutHelper.PercentLayoutParams    {        private PercentLayoutHelper.PercentLayoutInfo mPercentLayoutInfo;        public LayoutParams(Context c, AttributeSet attrs)        {            super(c, attrs);            mPercentLayoutInfo = PercentLayoutHelper.getPercentLayoutInfo(c, attrs);        }        @Override        public PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo()        {            return mPercentLayoutInfo;        }        @Override        protected void setBaseAttributes(TypedArray a, int widthAttr, int heightAttr)        {            PercentLayoutHelper.fetchWidthAndHeight(this, a, widthAttr, heightAttr);        }        public LayoutParams(int width, int height) {            super(width, height);        }        public LayoutParams(ViewGroup.LayoutParams source) {            super(source);        }        public LayoutParams(MarginLayoutParams source) {            super(source);        }    }}

这样我们就有了PecentLinearLayout,原来的LinearLayout的现在都可以用百分比的方式进行设置了。