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方法。
三者伪代码关系
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if(onInterceptTouchEvent(ev)) {
consume = onTouchEvent(ev);
} else {
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
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的事件体系的主要内容,如果未能解决你的问题,请参考以下文章
Android View体系从源码解析View的事件分发机制