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自适应。
如有不足欢迎评论补充。
-————
:不要处处与人争斗。有些人心理不平衡,完全是因为他们处处与人争斗,使得自己经常处于紧张状态。其实,人际之间应和谐相处,只要你不敌视别人,别人也不会与你为敌。
- Android 对于AutoLayout的一点小优化
- Autolayout的一点理解
- Android: 对于Handler的一点理解。
- 对于SPFA的两个小优化
- 对于列表的hover效果的一点小探讨
- 对于GC回收优化转贴文章的一点补充
- 对于GC回收优化转贴文章的一点补充
- 对于当下app应用的一点小想法
- 对于jsp和servlet的一点小认识
- 关于优化的一点小总结
- 关于对于google的android手机操作系统的一点想法!
- 对于as3 falsh 和 android java的一点理解
- 个人对于学习android开发的一点见解
- 对于gradle在android studio中使用的一点认识
- 对于敷铜一点小经验
- 对于php、mysql优化、angularjs的一些小感悟
- 学习 iOS Autolayout的一点经验
- 关于IOS Autolayout 的一点小记录
- Linux环境编译静态库动态库说明
- 程序员单身高达四成 吃早饭有助于涨薪水!
- hadoop记录篇6-数据仓库hive
- PAT考试乙级1009(C语言实现)
- J-Link在SWD模式与MCU能连接成功但不能读写
- Android 对于AutoLayout的一点小优化
- java中文乱码解决之道(七)-----JSP页面编码过程
- 48-同名覆盖引发的问题
- Android往Web服务器发送文件
- mysql主从设置
- IEEE JBHI 投稿因格式问题打回记录
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
- C++ #include的各种区别
- 分布式架构演进