转载请标明出处 Android源码详解目录

在讲解之前,先看一下demo

package com.example.androiddemo;import com.example.androiddemo.dispatch.LinearLayoutChild;import com.example.androiddemo.dispatch.LinearLayoutParent;import com.example.androiddemo.dispatch.TextView_Child;import com.example.androiddemo.utils.Util;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;public class DispatchActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(initView());}private View initView() {TextView_Child mTextView_Child = new TextView_Child(this);ViewGroup.LayoutParams params0 = new LayoutParams(getWindowManager().getDefaultDisplay().getWidth() / 2, getWindowManager().getDefaultDisplay().getHeight() / 4);mTextView_Child.setLayoutParams(params0);mTextView_Child.setBackgroundColor(getResources().getColor(android.R.color.holo_orange_dark));LinearLayoutChild mLinearLayoutChild = new LinearLayoutChild(this);mLinearLayoutChild.addView(mTextView_Child);mLinearLayoutChild.setBackgroundColor(getResources().getColor(android.R.color.holo_red_dark));ViewGroup.LayoutParams params1 = new LayoutParams(LayoutParams.WRAP_CONTENT, getWindowManager().getDefaultDisplay().getHeight() / 2);mLinearLayoutChild.setLayoutParams(params1);mLinearLayoutChild.setGravity(Gravity.CENTER);LinearLayoutParent mLinearLayoutParent = new LinearLayoutParent(this);mLinearLayoutParent.addView(mLinearLayoutChild);mLinearLayoutParent.setBackgroundColor(getResources().getColor(android.R.color.holo_green_dark));mLinearLayoutParent.setGravity(Gravity.CENTER);return mLinearLayoutParent;}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {boolean touch = super.dispatchTouchEvent(ev);Log.d("wld", "DispatchActivity_dispatchTouchEvent" + "_" + touch);Util.printEventLog("DispatchActivity", "dispatchTouchEvent", ev);return touch;}@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean touch = super.onTouchEvent(event);Log.d("wld", "DispatchActivity_onTouchEvent" + "_" + touch);Util.printEventLog("DispatchActivity", "onTouchEvent", event);return touch;}}
package com.example.androiddemo.utils;import android.util.Log;import android.view.MotionEvent;public class Util {public static void printEventLog(String className, String methodName,MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d("wld", className + "_" + methodName + "_" + "ACTION_DOWN");break;case MotionEvent.ACTION_MOVE:Log.d("wld", className + "_" + methodName + "_" + "ACTION_MOVE");break;case MotionEvent.ACTION_UP:Log.d("wld", className + "_" + methodName + "_" + "ACTION_UP");break;case MotionEvent.ACTION_CANCEL:Log.d("wld", className + "_" + methodName + "_" + "ACTION_CANCEL");break;default:break;}}}
package com.example.androiddemo.dispatch;import com.example.androiddemo.utils.Util;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.LinearLayout;public class LinearLayoutParent extends LinearLayout {public LinearLayoutParent(Context context) {super(context);}public LinearLayoutParent(Context context, AttributeSet attrs) {super(context, attrs);}public LinearLayoutParent(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {boolean touch = super.dispatchTouchEvent(ev);Log.d("wld", "LinearLayoutParent_dispatchTouchEvent" + "_" + touch);Util.printEventLog("LinearLayoutParent", "dispatchTouchEvent", ev);return touch;}@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean touch = super.onTouchEvent(event);Log.d("wld", "LinearLayoutParent_onTouchEvent" + "_" + touch);Util.printEventLog("LinearLayoutParent", "onTouchEvent", event);return touch;}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {boolean touch = super.onInterceptTouchEvent(ev);Log.d("wld", "LinearLayoutParent_onInterceptTouchEvent" + "_" + touch);Util.printEventLog("LinearLayoutParent", "onInterceptTouchEvent", ev);return touch;}}
package com.example.androiddemo.dispatch;import com.example.androiddemo.utils.Util;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.LinearLayout;public class LinearLayoutChild extends LinearLayout {public LinearLayoutChild(Context context) {super(context);}public LinearLayoutChild(Context context, AttributeSet attrs) {super(context, attrs);}public LinearLayoutChild(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {boolean touch = super.dispatchTouchEvent(ev);Log.d("wld", "LinearLayoutChild_dispatchTouchEvent" + "_" + touch);Util.printEventLog("LinearLayoutChild", "dispatchTouchEvent", ev);return touch;}@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean touch = super.onTouchEvent(event);Log.d("wld", "LinearLayoutChild_onTouchEvent" + "_" + touch);Util.printEventLog("LinearLayoutChild", "onTouchEvent", event);return touch;}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {boolean touch = super.onInterceptTouchEvent(ev);Log.d("wld", "LinearLayoutChild_onInterceptTouchEvent" + "_" + touch);Util.printEventLog("LinearLayoutChild", "onInterceptTouchEvent", ev);return touch;}}
package com.example.androiddemo.dispatch;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import com.example.androiddemo.utils.Util;public class TextView_Child extends TextView {public TextView_Child(Context context) {super(context);}public TextView_Child(Context context, AttributeSet attrs) {super(context, attrs);}public TextView_Child(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {boolean touch = super.dispatchTouchEvent(ev);Log.d("wld", "TextViewChild_dispatchTouchEvent" + "_" + touch);Util.printEventLog("TextViewChild", "dispatchTouchEvent", ev);return touch;}@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean touch = super.onTouchEvent(event);Log.d("wld", "TextViewChild_onTouchEvent" + "_" + touch);Util.printEventLog("TextViewChild", "onTouchEvent", event);return touch;}}
上面所有的返回值都是默认的,我们来看一下运行结果



我们点击中间的橘色,再来看一下打印的log



我们看到,默认情况下,全部返回false,并且DispatchActivity的onTouchEvent方法执行了DOWN,MOVE,UP方法,也就说是默认情况下,事件全部被DispatchActivity的onTouchEvent方法给处理了。上面仅仅是一个演示,其实用处并不是很大,只是作为一个了解,但对我们研究Android的事件分发机制有一定的意义,因为我们如果拦截或者处理事件机制的时候一般是在View及其子类中处理。接下来我们会把DispatchActivity中的两个方法dispatchTouchEvent和onTouchEvent注释掉,我们只研究View及其子类中的Event方法。我们知道除了Button及其ImageButton的onTouchEvent方法默认返回true以外,其他的都是返回false,因为Button和ImageButton默认情况下是消耗事件的,刚才上面我们看到TextView的onTouchEvent方法默认情况下返回的是false,就是事件没有被他消耗掉,下面我们把TextView换成Button在看一看,

public class TextView_Child extends Button {
顺便注释掉DispatchActivity中的dispatchTouchEvent和onTouchEvent方法,我们看一下log





我们可以看到默认情况下Button的onTouchEvent返回的是true,因为点击的时候事件默认被他消耗掉了。好了,这里只是给大家简单的开个头,接下来就会为大家讲解一下View事件的拦截及分发机制,最后在给大家分析源码。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android上一些方法的区别和用法的注意事项
  5. android实现字体闪烁动画的方法
  6. Android中dispatchDraw分析
  7. android studio Could not find com.android.support.constraint
  8. Android四大基本组件介绍与生命周期
  9. Android(安卓)MediaPlayer 常用方法介绍

随机推荐

  1. Android常见的异常之ClassNotFoundExcept
  2. Android日记之2012\01\16
  3. Android之全屏下软键盘弹出布局移动问题
  4. Android帧动画实现,防OOM,比原生动画集节
  5. Android中Looper讲解
  6. android 反射
  7. Android(安卓)app启动页广告
  8. Android(安卓)高版本(8、9、10)查看手机
  9. Android(安卓)studio开发APP时设置更改启
  10. [android] 百度地图开发 (二).定位城市位