View的事件传递
ViewGroup的事件传递
从activity传到控件----从控件传到子控件----如果没有任何消费或拦截----又冒泡到activity中
如果中间有传递或者拦截----则终止传递
写了一个demo的核心代码,如果要测试传递机制,则下载源码自己测试
package com.zhh.myview;
import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;
/**
* Created by 16838 on 2017/11/10.
*/
public class TouchEventFather extends LinearLayout {
private Point point;
public TouchEventFather(Context context, AttributeSet attrs) {
super(context, attrs);
point=new Point();
}
/**
* 继承的是ViewGroup在dispatchTouchEvent方法中判断出:点击事件,滑动事件和触摸事件
* 事件分发方法ViewGroup中有
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Logger.t("111").d("Father | dispatchTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
return super.dispatchTouchEvent(ev);
// return true;
}
/**
* @param ev
* @return
* 事件拦截方法,view中没有,activity中没有
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Logger.t("111").d("Father | onInterceptTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
return super.onInterceptTouchEvent(ev);
//return false;
}
/**
* 继承的是View在onTouchEvent方法中判断出:点击事件,滑动事件和触摸事件
* 事件触摸方法
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
Logger.t("111").d("Father | onTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
// 在这里会有根据xy的差值判断出点击事件,滑动事件和触摸事件
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
point.x= (int)ev.getX();
point.y= (int)ev.getY();
break;
case MotionEvent.ACTION_UP:
Logger.t("111").d(point.x+">>>"+(int) ev.getX()+">>>"+point.y+">>>"+(int)ev.getY());
int MyX=Math.abs(point.x-(int) ev.getX());
int MyY=Math.abs(point.y-(int) ev.getY());
if(MyX<50&&MyY<50){
// 回调点击事件
Logger.t("111").d("点击事件>>>>>>>>>");
}
break;
case MotionEvent.ACTION_MOVE:
break;
}
return super.onTouchEvent(ev);
// return true;
}
}
源码下载:
Myself ---- newtestecevt
http://download.csdn.net/download/zhaihaohao1/10111351
参考视频:
视频http://www.gulixueyuan.com/course/124/learn#lesson/1917