Android基础知识梳理之View相关知识

来源:互联网 发布:larrycms 源码下载 编辑:程序博客网 时间:2024/04/30 04:49

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这个层级的代码顺序就结束了。







0 0
原创粉丝点击