《Android 群英传》——读书笔记
一、Android控件架构
- Android中控件的分类:ViewGroup控件 以及 View控件
- VewGroup(父控件):可以包含多个View控件,并对其进行管理。上层控件负责下层子控件的测量与绘制,并进行交互事件的传递。
- Activity中使用的findViewById()就是在树控件中以树的深度优先遍历来查找对应元素。
View树结构图.jpg - 通过调用requestWindowFeature(Window.FEATURE_NO_TITLE)来设置全屏显示,一定要在调用setContentView()方法之前才会生效。
标准视图树.png
二、View的测量
- Android系统在绘制View之前,必须对View进行测量,即告诉系统改画一个多大的View。(在onMeasure()方法中进行)
- Android提供的测量View的类——MeasureSpec()类
- MeasureSpec——32位的int值。高2位:测量的模式。低30位:测量的大小。为提高优化效率在计算中采用的是位运算
- 测量模式的分类(三种):
- 1)EXACTLY——精确模式
为layout_width属性或者layout_height属性指定具体数值(100dp或者match_parent)时所使用的模式 - 2)AT_MOST——最大值模式
wrap_content 不超过父控件允许的最大尺寸即可。 - 3)UNSPECIFIED
不指定其大小测量模式,View想多大就多大,通常在绘制自定义View时才会使用。 - View类默认的onMeasure()方法只支持EXACTLY模式
三、View的绘制
- 画板——Canvas
- 画笔——Paint
- 通常需要继承View并重写他的onDraw()方法来完成绘图
- 其他地方使用Canvas需要创建一个Canvas对象。
Canvas canvas = new Canvas(bitmap);
- 传入参数bitmap与通过这个bitmap创建的Canvas画布紧密相连,这个过程称为:装载画布
- bitmap 用来存储所有绘制在Canvas上的像素信息
四、ViewGroup的测量
- 当ViewGroup的大小为 wrap_content 时,ViewGroup就需要对子View进行遍历,获取所有子View的大小,从而决定自身的大小。
- ViewGroup在测量时,遍历所有的子View,调用子View的Measure方法来获得每一个子View的测量结果。
- ViewGroup测量结束后,通过遍历子View的Layout方法,来指定其具体显示的位置,从而来决定其布局的位置。
五、ViewGroup的绘制
- 通常情况下不用绘制
- 会调用 dispatchDraw() 方法俩绘制其子View,遍历所有子View并调用子View的绘制方法来完成绘制工作。
六、自定义View
- 在自定义View时,重写onDraw()方法来绘制View的显示内容,若View使用 wrap_content 属性,还必须重写 onMeasure()方法
- 在View中通常有一下一些比较重要的回调方法:
1) onFinishInflate():从xml加载后回调
2) onSizeChanged():组件大小改变时回调
3) onMeasure():回调该方法来进行测量
4) onLayout():回调该方法来确定显示的位置
5) onTouchEvent():监听到触摸事件时回调 - 通常情况下有一下三种方法来实现自定义的控件
1) 对现有控件进行拓展;
2) 通过组合来实现新的控件;
3) 重写View来实现全新的控件;
1、对现有控件进行拓展
- 非常重要的自定义控件方法,在原生控件的基础上进行拓展
2、创建复合控件
- 可以很好的创建出具有重用功能的控件集合
网友评论