本来想直接手敲菜鸟的知识点,但是最后还是决定委屈一下电脑开着android studio结合代码来理解。
android app 中,View,ViewGroup所有用户交互组件的父容器。 相当于java awt中的 frame了把。 既然是awt包,那么很多的组件便是重量级,相对于swing 而言。 也就是说,他需要操作系统的底层支持,或者说是它的源。 因此,类推一下,这里的View,ViewGroup也及有可能是极度依赖android操作系统,由c提供支持。 自然,它是容器,那么可以放其它的ui组件便是情理中的事情。
下面结合代码查看一下它的主要方法,以及大体的实现过程:
可见,这个View 从结构性依赖上来看,实现了画图的一个回调,同时实现按键事件的一个回调,实现了一个貌似是接入事件源的接口。至少能知道的是: 它具有响应的能力,就像含羞草一样。 从多个回调可以看出。
从它的实例方法来看,语境上下文是唯一必需的属性,context长期以来一直是自己的理解的盲区。。 后面感觉将它理解为一个容器好一点,不是有这种叫法吗: spirng 容器 其实就是指的 那几个Context中的某一个,如ClassPathContext。 理解起来,倒有点主客倒置的意思,如A调用B,但是实际重要的确实B 中的方法去依赖A实现。。
此外,可以看出它们并不是通过Java实现,或者说不是通过语言本身实现。 另外,可能有朋友疑惑,它的子类在实例化时,有时候并没有显式的写出 super()方法。。 所以它的实现与这个没有什么关系。
针对这个问题的解答是:
1.首先,java是面向对象语言,面向对象语言的三大特性有:封装,继承,多态。 其中继承要求子类在加载的时候,默认会先加载父类进类加载器。 通过单步调试任意一个类都可以发现它初次被加载的时候必然会先将Object加载进类加载器。。 这里类似。
2.以上的是类加载过程时的理解。 还有就是java类规范要求。 子类在初始化的时候,默认就包含了super().
3.不论是面向对象还是面向过程语言,静态语言或者动态语言,脚本语言或者编程语言,解释型语言还是编译型语言,它们所有的特性,约束,设计模式,框架等等都是针对编译期而言的(不知道这样说对不对,大体意思就是与机器代码无关,最终的机器代码并不关心所有的这些内容)。 因此,这些内容都是人为划分的,具有很高的主观性。
感觉跑题了。继续回来。
View中所有的内容包括了2956行,去掉空格应该有2000行左右的。 其中有90%以上的方法要么是提供给子类实现,要么是通过jni实现。
通过View功能性依赖ViewGroup只有两个方法,inflate以及 onRequestSendAccessiblitityEvent. 其中前者是一个用于自定义View的方法,后者应该是某个事件的回调。。 它们实现都是通过jni。 换言之也就是依赖操作系统。
看完了View,再看看ViewGroup。
从类定义可以看出这些信息: 1,抽象类,无法直接被实例化。 2,是View的子类,也就是上面内容的子类。 3,实现了视图父类接口,视图管理器接口。
从它提供的实例方法来看,惊奇的发现它们都选择了父类的同一个构造函数,此外,Context上下文语境也是它们必需的参数。 图中圈出来的部分,猜想应该是资源内存地址等。 此外它们的属性集都为null.
在该类中搜索 View,可以看到右边圈出的部分,可见它它在运行时候,多处方法依赖了View. 毕竟它本身也是View的子类。。 下面就挑几个重要的方法看看。
以上的方法重要性从它们的名称便可以分辨出来。 包括增加视图,设置布局,子视图的设置等等的操作。 它们有一个共同的特点,那就是通过jni实现。
ViewGroup的子类中,包括了所有常见的布局文件。。 此外还包括一些View,如TvView,ToolBar,等。 除了名称比较不同外,它们都位于widget包下,有一定的指示意义。。 既然这几个特别的View继承自ViewGroup,那么从面向对象的角度,它就成了一个View的集合了,而不是一个单体。 ViewGroup相对于View来说,他又是一个View的子类或者实例(也就是它的实例布局文件,因为它本身是抽象的)。
折腾了半天,我们知道了两个问题。。 ViewGroup是View的一个子类; 它们是一个比较高的抽象层次,通过jni实现。但是原计划是打算解决一些实际的笔记内容的,因此坚持一下,继续整理布局的内容。 况且有了以上的基础之后,理解起来要轻松一些。
布局之线性布局:
它是使用的较多的布局,因为它的线性的布局,符合遍历的方式,如横向遍历,纵向遍历,即可以较轻松的照顾到界面的每个地方,使用起来又比较简单方便。
菜鸟上给出了它的一些基本属性。。 此外,它强调了权重的用法。
权重,是用来等比例划分区域的,相当于html中flex伸缩盒模型的 那个flex-grow 和 flex-shrink的因子。 看过菜鸟给的demo,我认为有个需要注意的问题,就是它的作用域的问题。 猜测应该是平级下(以标准xml文档为标准)自己的weight占所有weight和的比例。 或者说它是作用于外部的,如果我们将自己当成一个非ViewGroup的View,则我们并不能感受到weight的存在,至少是不能感受到父级view的存在。
此外若要对父级的weight起作用,可使用属性: layout_weight. 计算方式也有一些讲究,这里就不手敲了。
关于LinearLayout菜鸟给出的另一个较重要的知识点是driver。。
Linearlayout有个divider属性,设置分割线
使用方法:
android:divider="图片地址”,(注意,图片的资源名需要以字母开头)。
android:showDiviers="none|| beginning|| end|| middle(每两个组件中间)"。
dividerPadding="[0-9]*dp" (这里是模仿的正则写法。)
布局之相对布局,RelativeLayout
它基本属性包括: gravity-->设置容器内组件的对其方式,倒有点类似LinearLayout的orientention
ignoreGravity-->开启了该属性的主键,不受gravity属性的影响。 从这里可以推断,在解析gravity的时候,针对每个组件必然有判断ignoreGravity的逻辑。
它的一大特点,根据父容器和兄弟组件定位,用法示例:(其余的使用方法可以类推)
父容器布局:android:layout_centerInParent="true". 由于它的值为bool型,因此设置两个的话,编译时应该会报错的。
兄弟组件布局:android:layout_toRightOf=" 兄弟组件的地址".
此外关于margin和 padding 无须赘述。 因为html中有频繁用到,LinearLayout也多次用到。
布局之TableLayout,表格布局
表格布局用的相对较少,因为它性能较低,也就是渲染的时候比较费。
基本概念: TableRow容器
隐藏列-->collapseColumns
拉伸列-->stretchColumns
shrinkColumns-->收缩列
使用示例:
见菜鸟教程
布局之帧布局,FrameLayout
菜鸟说这个是六大布局中最简单的一个布局,对我而言,他反而更不好理解,是要难一些的。 就相当于html中的absolute与 relative的区别。
重要概念:
前景图像: 用于处于帧布局的最上面,直接面对用户的图像,相当于ppt的设置母视图的感觉。
用法: android:foreground="图片地址"
android:foregroundGravity="图像显示位置"
demo参见
菜鸟framelayout
布局之网格布局,gridLayout
首先,gridLayout是4.0引入的内容,从时间上看,也就是12年以后引入的。
使用的兼容性方面有两种解决思路:
1,修改build.gradle中的minSDK 大于等于14
2,低版本中引用v7支持包,使用的时候<android.support.v7.widget.GridLayout>
用法概要:
设置行列对齐方式
设置行列个数
设置组件所在行列
设置组件所占的行列
demo详见:
菜鸟gridLayout
布局之绝对布局,AbsoluteLayout
菜鸟先生说,这个基本不会用的,因为移植性差就这么简单粗暴。
使用方式,拖控件。。 刚开始的我是很喜欢的,尽管枯燥,但比起码代码更枯燥。。 现在算了吧呵呵。
六大布局整理完毕,看看时间发现还是可以去造作一下的嘿嘿。 明天将尽可能多的View实例给遍历一遍顺便整理笔记。