android 中View的一些零碎知识点

自定义View时一些关键方法

类别 方法 描述
创建 构造器
onFinishInflate() 在一个View以及它的子View已经从XML布局文件中生成后调用。
布局 onMeasure(int,int) 调用该方法来确定此View及其所有子View的大小要求。
onLayout(boolean,int,int,int,int) 负责确定View以及所有子View的指定大小和位置。
onSizeChanged(int,int,int,int) 在View的大小发生更改时调用。
绘制 onDraw(android.graphics.Canvas) 负责View视图的绘制工作
事件
处理
onKeyDown(int,KeyEvent) 按键抬下
onKeyUp(int,KeyEvent) 按键抬起
onTrackballEvent(MotionEvent) 当轨迹球运动事件发生时调用。
onTouchEvent(MotionEvent) 发生触摸屏运动事件时调用。
焦点 onFocusChanged(boolean, int, android.graphics.Rect) 视图获得或失去焦点时调用。
onWindowFocusChanged(boolean) 当前View所在的window获取或失去焦点时调用。
onAttachedToWindow() 视图附加到窗口时调用。
onDetachedFromWindow() 视图从其窗口分离时调用。
onWindowVisibilityChanged(int) 当包含View的window可见性发生更改时调用。

View的坐标体系

  • 坐标都是相对于View的父容器来说的,因此是一种相对坐标。
  • View在平移过程中,top和left表示的是原始左上角的位置信息,其值并不会改变,此时改变的事x、y、translationX、translationY这四个参数。
属性 解释
left 原始左上角横坐标(值不变)
top 原始左上角纵坐标(值不变)
right 原始右下角横坐标
bottom 原始右下角纵坐标
x 实时左上角横坐标,x=left+translationX
y 实时左上角纵坐标, y=top+translationY
translationX 相对于父容器X轴上的偏移量
translationY 相对于父容器Y轴上的偏移量
mScrollX 在滑动过程中,mScrollX的值总是等于
View左边缘View内容左边缘在水平方向的距离
mScrollY 在滑动过程中,mScrollY的值总是等于
View上边缘View内容上边缘在竖直方向的距离

View常用方法

invalidate()

Invalidate 整个View. 如果该View可见,会在将来某个时刻调用它的 #onDraw方法。
必须在UI线程调用该方法。如果想要在非UI线程调用,使用 #postInvalidate方法。
是否会执行 #onMeasure()#onLayout() 过程要根据标志位的状况来决定;

requestLayout()

该方法最终会调用到 ViewRootImpl#performTraversals() 方法,但是只会执行measure和layout流程,不会调用到draw流程来触发重画动作。

scrollTo(int x,int y)

实现了基于所传参数到的绝对滑动。
注意:该方法只能改变View内容的位置而不能改变View在布局中的位置。
The view will be invalidated.

scrollBy(int x,int y)

实现了基于当前位置的相对滑动,等价于scrollTo(mScrollX + x ,mScrollY + y)

注意:该方法只能改变View内容的位置而不能改变View在布局中的位置。
The view will be invalidated.

dispatchTouchEvent(MotionEvent event)

将触屏动作事件向下传到到目标View,或者如果它就是目标View。
返回True 如果事件会被这个View处理掉,否则返回false。

​ 以下是事件传递机制的一些结论:

  • 同一个事件序列是指从手指触屏屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列是以 down 事件开始,中间含有数量不定的 move 事件,最终以 up 事件结束。

  • 在正常情况下,一个事件序列只能被一个 View 拦截并且消耗,因为一旦一个元素拦截了此类事件,那么同一个事件序列内的所有事件都会直接交个它处理,因此同一个事件序列中的时间不能分别由两个 View 同时处理,当然可以通过特殊处理实现。

  • 某个 View 一旦决定拦截,那么这一个事件序列都只能由它来处理(如果事件序列能够传递给它的话),并且它的 onInterceptTouchEvent 不会再被调用。可以理解为当一个 View 决定拦截一个事件后,那么系统会把同一个事件序列内的其它方法都直接交给它来处理,因此就不再调用这个 ViewOnInterceptTouchEvent 去询问他是否要拦截。

  • 某个 View 一旦开始处理事件,如果它不消耗 ACTION_DOWN 事件( onTouchEvent 返回了 false ),那么同一事件序列中的其它事件都不会再交給它处理,并且事件将重新提交给它的父元素处理,即父元素的 onTouchEvent 会被调用。

  • 如果 View 不消耗除 ACTION_DOWN 以外的其它事件,那么这个点击事件会消失,此时父元素的 onTouchEvent 不会被调用,并且当前 View 可以持续收到后续的事件,最终这些消耗掉的点击事件会被传递给Activity处理。

  • ViewGroup 默认不会拦截任何事件。 Android 源码中 ViewGroupOnInterceptTouchEvent 方法默认返回 false

  • View 没有 onInterceptTouchEvent 方法,一旦有点击事件传递给它,那么它的 onTouchEvent 方法就会被调用。

  • ViewonTouchEvent 默认都会消耗事件(返回 true ),除非它是不可点击的( clickablelongclickable 同时为 false )。 Viewlongclickable 默认为 falseclickable 属性要分情况,比如 Buttonclickable 属性默认为 true ,而 TextViewclickable属性默认为 false

  • Viewenable 属性不影响 onTouchEvent 的默认返回值,哪怕一个 Viewdisable 状态的,只要它的 clickablelongclickable 有一个为 true ,那么它的 onTouchEvent 就返回 true

  • onClick 会发生的前提是当前 View 是可点击的,并且它收到了 downup 的事件。

  • 事件传递过程是由外向内的,即事件总是先传递给父元素,然后在交个父元素分发给子 View ,通过 requestDisallowInterceptTouchEvent 方法可以在子元素中干预父元素的事件分发过程,但是 ACTION_DOWN 事件除外。


View动画

帧动画 (Frame Animation)

描叙: 顺序播放实现做好的图像,是一种画面转换动画

补间动画 (View Animation)

描叙: 通过对场景里的对象不断做图像变换,包括平移(Translate)、缩放(Scale)、旋转(Rotate)、透明度(Alpha)产生的动画效果,是一种渐变动画

特性

  • 只是显示的位置变动,View的实际位置为改变,变现为View移动到其他地方,点击事件仍在原处才可相应。

属性动画(Property Animation)

描述: 通过动态地改变对象的属性从而达到动画效果,包括 ValueAnimatorObjectAnimatorAnimatorSet 等关键类。

特性

  • 支持对所有View能更新的属性的动画(需要属性的set/get方法)
  • 更改的是View的实际属性,不影响器动画执行后所在位置的点击事件的正常使用

你可能感兴趣的:(android)