自定义布局
package com.yztc.eventdemo; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; /** * 自定义layout布局 */ public class CustomLayout extends LinearLayout{ public CustomLayout(Context context) { super(context); } public CustomLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { Log.i("tag","----------CustomLayout---------onTouchEvent---"+getEventName(event)); return true; } /**dispatchTouchEvent 分发事件的方法 不管是view还是viewGroup都具有分发事件的函数 * 一般情况ViewGroup中将事件分发给子view View中将事件分发给自己 * 当事件触发时activity将事件传递到layout layout调用自己的分发方法将事件分发给具体的子控件 * 子控件也具有分发方法 但是子控件只能分发给自己 * 接着获取分发的事件调用onTouchEvent()方法处理事件 * * 如果返回true 表示事件会分发给当前的view的dispatchTouchEvent进行处理 并且会停止事件向下传递分发 * 一般情况都不会修改返回值 改变正常的事件分发流程 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.i("tag","----------CustomLayout---------dispatchTouchEvent---"+getEventName(ev)); return true; } /** * onInterceptTouchEvent事件拦截的方法 * 事件传递给layout 如果layout不进行拦截 通过拦截的方法 事件就被分发给具体的子控件, * 子控件就会执行自己的分发和onTouchEvent()方法处理事件 如果子控件的onTouchEvent()方法并且对 * 事件处理 事件回传 执行layout中的onTouchEvent() 如果layout中也返回false 事件消失; 如果 * layout中onTouchEvent()返回true 那么后续的事件也会直接交给layout处理 * * 返回true 表示拦截当前的事件并且交给当前视图的onTouchEvent()处理 * 返回false 表示不拦截 按照正常的事件传播机制 */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.i("tag","----------CustomLayout---------onInterceptTouchEvent---"+getEventName(ev)); if(ev.getAction()==MotionEvent.ACTION_MOVE){ return true; } return false; } public String getEventName(MotionEvent event){ String eventName=""; switch (event.getAction()){ case MotionEvent.ACTION_DOWN: eventName="Down 按下"; break; case MotionEvent.ACTION_MOVE: eventName="Move 移动"; break; case MotionEvent.ACTION_UP: eventName="Up 抬起"; break; } return eventName; } } 自定义view视图package com.yztc.eventdemo; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; /** * 自定义控件 */ public class CustomView extends View{ public CustomView(Context context) { super(context); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); } /** * onTouchEvent()表示对事件处理的方法 * 如果事件传播到该类中 表示该类调用onTouchEvent()方法处理该事件 * 如果该函数返回false 表示不进行事件的处理 将事件进行回传(回传给上层的view或者是viewGroup * 由上层的view调用自己的onTouchEvent()方法处理,如果上层的view也未进行事件处理onTouchEvent * 返回false那么事件消息 并且接受不到下一次事件 例如:没有处理down事件就不能处理up事件) * 如果该方法返回true 表示对当前的事件进行处理 事件只能被处理一次 * 注意:onTouchEvent()返回false与返回super.onTouchEvent(event) 意思一样 */ @Override public boolean onTouchEvent(MotionEvent event) { Log.i("tag","----CustomView----onTouchEvent---"+getEventName(event)); return false; } @Override public boolean dispatchTouchEvent(MotionEvent event) { Log.i("tag","----CustomView----dispatchTouchEvent---"+getEventName(event)); return super.dispatchTouchEvent(event); } public String getEventName(MotionEvent event){ String eventName=""; switch (event.getAction()){ case MotionEvent.ACTION_DOWN: eventName="Down 按下"; break; case MotionEvent.ACTION_MOVE: eventName="Move 移动"; break; case MotionEvent.ACTION_UP: eventName="Up 抬起"; break; } return eventName; } }