LinearLayoutCompat源码浅析
来源:互联网 发布:移动网络网页游戏 编辑:程序博客网 时间:2024/06/06 20:23
1、google为了整理之前app开发的碎片化,净化app生态环境,下了很大的力气,比如Mertrial Design的引入,v7包appcompat组件的封装,这里主要拿v7包里的LinaerLayoutCompat的举例;
2、LinearLayoutCompat说白了就是LinearLayout,它是v7包引入的,提高vXXX包的内容,我们第一个会想到的就是向下兼容,没错他就是LinearLayout的兼容版本。
3、LinearLayout在3.0以后引入了子布局分割线的概念,在4.0以后引入了分割线padding的概念,两者有什么区别呢,普通的Linearlayout中使用分割线的用法如下:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/ic_launcher"
android:orientation="vertical"
android:showDividers="middle" >
<android.support.v7.widget.AppCompatButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
v7的android.support.v7.widget.LinearLayoutCompat:
<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.example.studyday"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
android:orientation="vertical"
app:divider="@drawable/ic_launcher"
app:showDividers="middle" >
</android.support.v7.widget.LinearLayoutCompat>
4、细心的你可能已经发现了他们的区别:普通的使用android的命名空间,而v7里面使用的是app自定义的明明空间,同时在上面代码中AppCompatButton和LinaerLayoutCompat一样哦都是v7为了第1条提到的那样能够替代Button才引入的哦。
5、套用我同事的话“好吧,是时候展现真正的技术了哈哈哈”,来看看源码吧。
(1)其实你在XML的设置的属性,都会转变成java对象来处理。因为ADT查看v7包源码比较烦人,我就姑且看了一样LinearLayout原理都是一样的。在LinearLayout构造函数中其实就对showDividers的显示做了初始化,如果你在xml中没有设置该属性那它会为其设置默认不现实的值:SHOW_DIVIDER_NONE,同时也设置了默认的divider样式以及dividerPadding=0不多说了直接上源码吧:
setDividerDrawable(a.getDrawable(R.styleable.LinearLayout_divider));
mShowDividers = a.getInt(R.styleable.LinearLayout_showDividers, SHOW_DIVIDER_NONE);
mDividerPadding = a.getDimensionPixelSize(R.styleable.LinearLayout_dividerPadding, 0);
接下来一一介绍与之相关的三个方法:
public void setDividerDrawable(Drawable divider) :设置了divider的样式,如果用户设置了该值才会为divider设置长宽去显示,并在数据是空时做了一系列优化性能的工作。
public void setDividerPadding(int padding) :设置了divider的Padding的值
public void setShowDividers(@DividerMode int showDividers):设置了具体的显示方式,其中用到了注解数组,也就以为了可以同时设置多种显示方式,数组的值对应着十六进制的0、1、2、4,好吧我也不知道3去哪了。拼接方式估计你也猜到了就是用|运算啦哈哈哈。
注意:用户如果设置了dividerDrawable和ShowDividers都会去调用View的 requestLayout()去重新摆放布局位置。
6、题外话:Android的主要历史更新版本4.0,4.4.5.0等几个主要版本,但是目前开发app一般都兼容到4.0就够了,最多兼容到3.0哦。谈到兼容无非屏幕属性的适配、语言适配、平台版本的适配,在开发中需要兼容的资源都存放在res目录下,例如:values-XXX,XXX对应着上面提到的适配对象,不考虑国际化app,常见的一般都是针对平台的适配,例如values-11 values-14,在这里面可以针对不同的版本的values属性进行设置。
2、LinearLayoutCompat说白了就是LinearLayout,它是v7包引入的,提高vXXX包的内容,我们第一个会想到的就是向下兼容,没错他就是LinearLayout的兼容版本。
3、LinearLayout在3.0以后引入了子布局分割线的概念,在4.0以后引入了分割线padding的概念,两者有什么区别呢,普通的Linearlayout中使用分割线的用法如下:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/ic_launcher"
android:orientation="vertical"
android:showDividers="middle" >
<android.support.v7.widget.AppCompatButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
v7的android.support.v7.widget.LinearLayoutCompat:
<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.example.studyday"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
android:orientation="vertical"
app:divider="@drawable/ic_launcher"
app:showDividers="middle" >
</android.support.v7.widget.LinearLayoutCompat>
4、细心的你可能已经发现了他们的区别:普通的使用android的命名空间,而v7里面使用的是app自定义的明明空间,同时在上面代码中AppCompatButton和LinaerLayoutCompat一样哦都是v7为了第1条提到的那样能够替代Button才引入的哦。
5、套用我同事的话“好吧,是时候展现真正的技术了哈哈哈”,来看看源码吧。
(1)其实你在XML的设置的属性,都会转变成java对象来处理。因为ADT查看v7包源码比较烦人,我就姑且看了一样LinearLayout原理都是一样的。在LinearLayout构造函数中其实就对showDividers的显示做了初始化,如果你在xml中没有设置该属性那它会为其设置默认不现实的值:SHOW_DIVIDER_NONE,同时也设置了默认的divider样式以及dividerPadding=0不多说了直接上源码吧:
setDividerDrawable(a.getDrawable(R.styleable.LinearLayout_divider));
mShowDividers = a.getInt(R.styleable.LinearLayout_showDividers, SHOW_DIVIDER_NONE);
mDividerPadding = a.getDimensionPixelSize(R.styleable.LinearLayout_dividerPadding, 0);
接下来一一介绍与之相关的三个方法:
public void setDividerDrawable(Drawable divider) :设置了divider的样式,如果用户设置了该值才会为divider设置长宽去显示,并在数据是空时做了一系列优化性能的工作。
public void setDividerPadding(int padding) :设置了divider的Padding的值
public void setShowDividers(@DividerMode int showDividers):设置了具体的显示方式,其中用到了注解数组,也就以为了可以同时设置多种显示方式,数组的值对应着十六进制的0、1、2、4,好吧我也不知道3去哪了。拼接方式估计你也猜到了就是用|运算啦哈哈哈。
注意:用户如果设置了dividerDrawable和ShowDividers都会去调用View的 requestLayout()去重新摆放布局位置。
6、题外话:Android的主要历史更新版本4.0,4.4.5.0等几个主要版本,但是目前开发app一般都兼容到4.0就够了,最多兼容到3.0哦。谈到兼容无非屏幕属性的适配、语言适配、平台版本的适配,在开发中需要兼容的资源都存放在res目录下,例如:values-XXX,XXX对应着上面提到的适配对象,不考虑国际化app,常见的一般都是针对平台的适配,例如values-11 values-14,在这里面可以针对不同的版本的values属性进行设置。
0 0
- LinearLayoutCompat源码浅析
- LinearLayoutCompat源码浅析
- LinearLayoutCompat源码简单分析
- LinearLayoutCompat
- LinearLayoutCompat分割线效果源码分析
- LinearLayoutCompat的源码分析分割线的具体实现
- LinearLayoutCompat组件
- 分析v7中的LinearLayoutCompat类
- nginx源码浅析--源码编译
- Hibernate源码浅析
- TProactor源码浅析一
- LinkedList源码浅析
- Spring FactoryBean源码浅析
- Hessian源码浅析-HessianSkeleton
- Hessian源码浅析-HessianProxy
- Struts2源码浅析-Container
- Struts2源码浅析-初始化
- Struts2源码浅析-ConfigurationProvider
- 图的邻接表数据结构的C++实现方法
- 开发者的协助工具
- 使用Camera2 替代过时的Camera API
- ifram自动获取高度
- 错误:espliseappcompat_v7] ERROR: In <declare-styleable> MenuView, unable to find attribute android:pre
- LinearLayoutCompat源码浅析
- 获取Iphone里面的数据
- js中的 "use strict" 做了什么?使用严格模式有什么优点
- Tomcat项目部署方式
- Visual Studio 2013 连接MySQL数据库
- sass
- 普通用户和超级用户之间的切换
- 机器学习常见算法分类汇总
- 高德地图(一)