1、Android ui界面架构:具体的ui都会被绑定在某个Activity上。
Activity 都包含一个名为Window的对象,而Window对象会设置一个DecorView的View为整个应用窗口的根布局。
2、View的测量
掌握MeasureSpec, 一个MeasureSpec是一个32位的int,高2位是测量的模式,低30位是大小。
MeasureSpec的模式用3种:EXACTLY 、AT_MOST 和UNSPECIFIED
绘制过程中,当测量模式为AT_MOST或者UNSPECIFIED时,重写onMeasure方法应该指定一个默认大小。
掌握重写onMeasure方法
3、view的绘制
掌握重写onDraw方法,Canvas类和Paint类,
提及到了一个Canvas使用技巧,比较重要。虽然onDraw方法提供了一个Canvas对象,但是在实际开发中,尤其是复杂绘制中,都会创建多个Canvas对象。
通过这些Canvas对象对现有bitmap(一般都是bitmap对象,其他没见过)进行绘制。例如 :
onDraw方法已有 Canvas systemCanvas; 我们会创建一个Canvas mCanvas = new Canvas(bitmap); 在改mCanvas上进行一系列绘制,
而后调用系统的systemCanvas.drawBitmap(bitmap,0,0,null)(群英传书上是先调用这个方法,个人认为这个方法先后调用都是可以的,待验证)
我认为,这样的好处是可以创建多个canvas对象分别绘制一小部分然后组合达到最终的绘制效果。
4、viewgroup的测量
如果是wrap_content 属性,那么viewgroup测量将会遍历子view的onMeasure 方法。如果是exactly的话,直接指定大小。和view类似。
5、viewgroup绘制
diapacthDraw完成子view绘制,本身没有太多绘制。
6、自定义控件:
3种方式:1、扩展现有view,2、组合 3、完全自定义。
知识点:view中的重要回调:onFinishInflate() xml加载组件后回调
onSizeChanged() 组件大小改变回调
onMeasure() 测量时调用
onLayout() 确定显示的位置
onTouchEvent() 触控时间监听。
掌握属性定制的技巧:首先在attrs.xml中定义<deckare-style>标签 <attr>标签定制具体属性。
在代码中使用TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.xxx);
String text = a.getString(R.styleable.xxx_yyy) //xxx为declare-style标签下的name的值, yyy为attr标签下的name的值,string为attr标签下format的值
a.recycle();// 用完要回收这个对象
7、viewgroup的定制,比view复杂了点。但是基本不变。在相应的方法中遍历子view。
8、事件拦截机制:书上讲的基本对,但是个人觉得有比较深入了解下。
如图
参考自http://blog.csdn.net/u013356254/article/details/51018150
个人认为时间拦截应该从偏代码的角度去分析,比较容易理解。
首先3个方法 dispatchtouchevent onIntercaptTouchEvent onTouchEvent
dispatchtouchevent是事件分发的第一步,不同于其他分析,我认为dispatchtouchevent也是最后一步。在dispatchtouchevent方法中会调用到其他onintecapttouchevent 和ontouchevent。当dispatchtouchevent函数返回的时候这个view的分发结果就已经出来了。
就b 控件一个层级来分析(基于我们已经大概了解了分发机制) 当b调用dispatchtouchevent时,
首先他会检查b空间的onintercapttouchevent方法,如果是true 代表拦截了事件分发,将不会调用子一级也就是c控件的dispatch 也就触发不了c的ontouch和可能的onintercapt了。这时候程序继续调用b的ontouch 处理touch事件,这个时候ontouch返回的值就是dispatchtouchevent返回的值,代表着view的时间是否被处理。
假如b控件的onintercapt返回false呢,那么继续调用下一集的ondispatch,进入递归,当循环结束后判断下一级dispatch的返回值,如果是true就返回true,如果是false 就继续调用b的ontouchevent进行处理,并以ontouch的返回值作为最终dispatch的返回值。 最终b这个控件层级的返回值就最终确定了,然后返回到a。最终b这个层级的代码顺序就结束了。