View的事件体系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了View的事件体系相关的知识,希望对你有一定的参考价值。

一、View基础
View的位置参数:
参数:top,left,right,bottom
           x,y,translationX,translationY(android3.0之后)
四个顶点确定:top(左上纵坐标)、left(左上横坐标)、right(右下横坐标)、bottom(右下纵坐标)。相对于父容器来说的。
View的位置坐标和父容器的关系:
技术分享
得出View的宽高和坐标的关系:
width  = right - left
heigth = bottom - top
Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom();

x和y:View左上角的坐标
translationX和translationY:左上角相对于父容器的偏移量
x = left + translationX
y = top + translationY

MotionEvent:
ACTION_DOWN、ACTION_MOVE、ACTION_UP。
getX/getY:当前View左上角的x和y左边
getRawX/getRawY:相对于手机屏幕左上角的x和y坐标

TouchSlop:
系统所能识别的被认为是滑动的最小距离。
获取方式:ViewConfiguration.get(getContext()).getScaledTouchSlop();

VelocityTracker:
速度追踪,追踪手指滑动过程速度

GestureDetector:
手势检测,辅助检测用户单击,滑动,长按,双击等行为。

Scroller:
弹性滑动对象,和View的computeScroll方法配合使用完成View的弹性滑动。

二、View滑动
实现View滑动的方法:
1、View本身提供的scrollTo/scrollBy方法;
     scrollBy(int x ,int y):它是相对于当前位置的相对滑动
     scrollTo(int x ,int y):它是基于传递参数的绝对滑动
     只能滑动View的内容,不能滑动View本身。
2、View平移效果;
      使用动画平移,动画并不能改变view真正的位置参数,如果希望动画结束之后的状态得到保留需设置fillAfter属性为true。
      动画的平移之后3.0以下版本无法响应新位置的click事件。
3、动态改变布局参数,即LayoutParams。

三、View和ViewGroup事件分发
点击事件的事件分发涉及到的方法:
dispatchTouchEvent:事件传递给当前View,该方法一定会执行;
onInterceptTouchEvent:是否拦截某个事件;
onTouchEvent:处理点击事件;
这里注意View没有onInterceptTouchEvent方法,一旦事件交给它会执行onTouchEvent方法。
三者伪代码关系
  1. public boolean dispatchTouchEvent(MotionEvent ev) {
  2. boolean consume = false;
  3. if(onInterceptTouchEvent(ev)) {
  4. consume = onTouchEvent(ev);
  5. } else {
  6. consume = child.dispatchTouchEvent(ev);
  7. }
  8. return consume;
  9. }
ViewGroup的事件传递是从ViewGroup传递给子元素。
View如果设置OnTouchListenter,那么onTouch方法被回调,返回true,onTouchEvent会被调用。onTouchEvent方法中,如果设置OnClickListener,
它的onClick会被调用。
优先级,OnTouchListenter>onTouchEvent>OnClickListener。

滑动冲突的解决方法:
1、外部拦截法(推荐);  
      在父容器的onInterceptTouchEvent方法里内部拦截,ACTION_DOWN事件父容器返回False不拦截,否则ACTION_MOVE和ACTION_UP都直接给
      父容器处理,ACTION_UP返回false不拦截。
2、内部拦截法;
      重写子容器的dispatchTouchEvent的方法,让父容器拦截ACTION_MOVE和ACTION_UP事件,即调用父容器的
      parent.requestDisallowInterceptTouchEvent(true)。

   


































以上是关于View的事件体系的主要内容,如果未能解决你的问题,请参考以下文章

彻底理解View事件体系!

view的事件体系

View的事件体系

Android View体系从源码解析View的事件分发机制

Android艺术开发探索第三章————View的事件体系(下)

view 事件体系