1.View是Android中所有控件的基类,View是一种界面层的控件的一种抽象代表了一个控件。ViewGrouo继承与VIew,所以View本身就可以是单个控件也可以是多个控件组成的一组控件
2.View位置描述的几个点:top.left.right.bottom,这几个值均是针对Vie原始位置的上左右下位置信息,即使View移动时,其值也不会发生变化,此时变化的是x和translationX,y和translationY
3.getX/getY:返回相对于当前View左上角的x和Y坐标
getRawX和getRawY:返回相对于手机屏幕左上角的x和y坐标
4.TouchSlop:系统可以识别出的滑动的最小距离,是一个常量和设备有关,可以通过ViewConfiguration.get(getContext).getScaledTouchSlop()获得
5.Scroller配合computerScroll可以实现弹性滑动效果,并不会像scrollBy和scrollTo那样瞬间完成。
6.View滑动的三种方式
6-1:View本身提供的scrollTo,scrollBy方法(scrollBy:基于当前位置的相对滑动,内部调用scrollTo,scrollTo基于所传递参数的绝对滑动,操作简单,适合对View内容的移动,这种方式也只能滑动View的内容,而不能滑动View本身)
6-2:使用位移动画(补间动画只是改变了View内容的位置,并没有改变View真正位置,属性动画改变的是VIew真正的位置,使用简单,适用于没有交互的View和实现复杂的动画效果)
6-3:动态改变View布局参数(操作复杂,适用于有交互的View)
7.View弹性滑动的实现思想:将一次大的滑动分成若干次小的滑动并且在一个时间段内完成
8.Scrller滑动的思想:通过startScroll中的invalidate方法去触发draw方法,然后draw方法中的computeScroll方法将会被调用,computerScroll方法中获取当前的x和y,然后通过scrollTo方法去滑动,然后又通过postInvalidate方法触发draw方法,如此循环往复,直至滑动结束。其中X和Y是根据滑动总距离和滑动时间计算出的,计算思想相似于属性动画中插值器的概念。
9.通过延时器的策略去实现滑动,主要是利用插值器获取时间节点对应的X和Y。
10.View事件分发其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生以后,系统需要把这个事件传递给一个具体的View,而这个传递过程就是分发过程。三个重要的方法:dispatchEvent、onInterceptTouchEvent、和onTouchEvent
11.dispatchTouchEvent:表示是否消耗当前事件,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响。
12.onInterceptTouchEvent:在dispatchTouchEvent中调用,表示是否拦截某事件,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会再被调用,返回结果表示是否拦截当前事件。
13.onTouchEvent:在dispatchTouchEvent方法中调用,表示是否消耗当前事件,如果不消耗,则在同一个事件序列中此方法将不会再被调用
14.事件分发调用优先级:OnTouch>onTouchEvent>onClick,事件传递的顺序:Activity-window-View
15.事件一旦交给一个View处理,那么他就必须消耗掉事件,否则同一事件序(手指按下屏幕开始,离开屏幕结束,down-move….move-up)列中剩下的事件将不会交给他处理
16.子元素中可以通过requestDisallowInterceptTouchEvent方法干预父元素中的事件分发
17.ViewRoot对应于ViewRootImpl类,连接WindowManger和DecorView,View的三大流程均通过ViewRoot来完成,View的绘制流程从ViewRoot的performTraversals开始,进过mesure、layout、draw三个过程。performTraversals会依次调用performMeasure、performLayout和performDraw三个方法,这三个方法分别完成顶层View的measure、Layout、draw,performMeasure中调用measure,measure中调用onMeasure,在onMeasure中完成对所有子元素的measure,这时候measure流程就从父容器传递到了子元素,完成了一次measure过程。
18.获取View宽和高的方式
18-1.onWindowFocusChanged(会多次调用)
18-2.view.post(Runnable)
18-3.ViewTreeObserver在onGlobalLayout接口中
18-4.view.measure方法
19.getMeasuredWidth获取到的是测量宽高(onMeasure方法中),getWidth获取到的是最终宽高(onLayout方法中)mRight-mLeft的值,除非某种特殊的情况,否则二者相等。
20.View的draw过程
20-1.绘制背景 background.draw(canvas)
20-2.绘制自己(onDraw)
20-3.绘制children(dispatchDraw)
20-4.绘制装饰(onDrawScrollBars)
21.自定义View时候,两个重要的方法onAttachToWindow方法和onDetachToWindow方法,当View不可见时,记得需要停止View的动画,否则有可能呢造成内存泄漏