Android 对于AutoLayout的一点小优化

来源:互联网 发布:数据库原理中的设计题 编辑:程序博客网 时间:2024/06/06 02:06

AutoLayout原文地址
http://blog.csdn.net/lmj623565791/article/details/49990941;
本文出自:【张鸿洋的博客】

最近在使用鸿洋大神写的AutoLayout框架时,发现只支持LinearLayout,RelativeLayout,FrameLayout这三种常用布局。但是我最近刚好准备使用DrawerLayout发现无法适配。这让我很尴尬阿 。偶然翻看源码,发现此事另有转机阿。

下面我们来看一下源码:

public class AutoLayoutActivity extends AppCompatActivity {    private static final String LAYOUT_LINEARLAYOUT = "LinearLayout";    private static final String LAYOUT_FRAMELAYOUT = "FrameLayout";    private static final String LAYOUT_RELATIVELAYOUT = "RelativeLayout";    private static final String LAYOUT_DRAWERLAYOUT = "DrawerLayout";    @Override    public View onCreateView(String name, Context context, AttributeSet attrs) {        View view = null;        if (name.equals(LAYOUT_FRAMELAYOUT)) {            view = new AutoFrameLayout(context, attrs);        }        if (name.equals(LAYOUT_LINEARLAYOUT)) {            view = new AutoLinearLayout(context, attrs);        }        if (name.equals(LAYOUT_RELATIVELAYOUT)) {            view = new AutoRelativeLayout(context, attrs);        }        if (view != null) return view;        return super.onCreateView(name, context, attrs);    }}

首先这个是我们需要继承的AutoLayoutActivity.class的源码很简单。只需要根据类型返回一个自定义Auto的布局即可,我翻看了这几个Auto的布局,大致代码基本一样这里只选取其中一个类的源码

public class AutoRelativeLayout extends RelativeLayout{    private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);    public AutoRelativeLayout(Context context)    {        super(context);    }    public AutoRelativeLayout(Context context, AttributeSet attrs)    {        super(context, attrs);    }    public AutoRelativeLayout(Context context, AttributeSet attrs, int defStyle)    {        super(context, attrs, defStyle);    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    public AutoRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);    }    @Override    public LayoutParams generateLayoutParams(AttributeSet attrs)    {        return new LayoutParams(getContext(), attrs);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)    {        if (!isInEditMode())            mHelper.adjustChildren();        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    @Override    protected void onLayout(boolean changed, int left, int top, int right, int bottom)    {        super.onLayout(changed, left, top, right, bottom);    }    public static class LayoutParams extends RelativeLayout.LayoutParams            implements AutoLayoutHelper.AutoLayoutParams    {        private AutoLayoutInfo mAutoLayoutInfo;        public LayoutParams(Context c, AttributeSet attrs)        {            super(c, attrs);            mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);        }        public LayoutParams(int width, int height)        {            super(width, height);        }        public LayoutParams(ViewGroup.LayoutParams source)        {            super(source);        }        public LayoutParams(MarginLayoutParams source)        {            super(source);        }        @Override        public AutoLayoutInfo getAutoLayoutInfo()        {            return mAutoLayoutInfo;        }    }}

我发现这三个类的一个共同点就是都继承了原本的Layout类,其他逻辑处理基本一样,只有这个类型是不同的。这时我有一个大胆的想法,如果我们在定义个相同模式的布局文件会出现咋样的情况呢?

由于我需要的是DrawerLayout所以在此处定义一个AutoDrawerLayout的类

public class AutoDrawerLayout extends DrawerLayout {    private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);    public AutoDrawerLayout(Context context)    {        super(context);    }    public AutoDrawerLayout(Context context, AttributeSet attrs)    {        super(context, attrs);    }    public AutoDrawerLayout(Context context, AttributeSet attrs, int defStyleAttr)    {        super(context, attrs, defStyleAttr);    }    @Override    public LayoutParams generateLayoutParams(AttributeSet attrs)    {        return new LayoutParams(getContext(), attrs);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)    {        if (!isInEditMode())        {            mHelper.adjustChildren();        }        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    @Override    protected void onLayout(boolean changed, int left, int top, int right, int bottom)    {        super.onLayout(changed, left, top, right, bottom);    }    public static class LayoutParams extends DrawerLayout.LayoutParams            implements AutoLayoutHelper.AutoLayoutParams    {        private AutoLayoutInfo mAutoLayoutInfo;        public LayoutParams(Context c, AttributeSet attrs)        {            super(c, attrs);            mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);        }        public LayoutParams(int width, int height)        {            super(width, height);        }        public LayoutParams(int width, int height, int gravity)        {            super(width, height, gravity);        }        public LayoutParams(ViewGroup.LayoutParams source)        {            super(source);        }        public LayoutParams(MarginLayoutParams source)        {            super(source);        }        public LayoutParams(DrawerLayout.LayoutParams source)        {            super((MarginLayoutParams) source);            gravity = source.gravity;        }        public LayoutParams(LayoutParams source)        {            this((DrawerLayout.LayoutParams) source);            mAutoLayoutInfo = source.mAutoLayoutInfo;        }        @Override        public AutoLayoutInfo getAutoLayoutInfo()        {            return mAutoLayoutInfo;        }    }}

并在AutoLayoutActivity中类型判断的时候加入我的此种类型,修改后代码如下

public class AutoLayoutActivity extends AppCompatActivity {    private static final String LAYOUT_LINEARLAYOUT = "LinearLayout";    private static final String LAYOUT_FRAMELAYOUT = "FrameLayout";    private static final String LAYOUT_RELATIVELAYOUT = "RelativeLayout";    //DrawerLayout相关    private static final String LAYOUT_DRAWERLAYOUT = "DrawerLayout";    @Override    public View onCreateView(String name, Context context, AttributeSet attrs) {        View view = null;        if (name.equals(LAYOUT_FRAMELAYOUT)) {            view = new AutoFrameLayout(context, attrs);        }        if (name.equals(LAYOUT_LINEARLAYOUT)) {            view = new AutoLinearLayout(context, attrs);        }        if (name.equals(LAYOUT_RELATIVELAYOUT)) {            view = new AutoRelativeLayout(context, attrs);        }        //DrawerLayout相关        if (name.equals(LAYOUT_DRAWERLAYOUT)) {            view = new AutoDrawerLayout(context, attrs);        }        if (view != null) return view;        return super.onCreateView(name, context, attrs);    }}

这样AutoDrawerLayout就定义完成。
我认为其他的Layout,比如ConstraintLayout这种也可以通过此种方式来进行px自适应。
如有不足欢迎评论补充。

-————
:不要处处与人争斗。有些人心理不平衡,完全是因为他们处处与人争斗,使得自己经常处于紧张状态。其实,人际之间应和谐相处,只要你不敌视别人,别人也不会与你为敌。

原创粉丝点击