在CeShiActivity.java文件中

public class CeShiActivity extends AppCompatActivity {    private YuanHuView button;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.ceshiactivity);        button = (YuanHuView) findViewById(R.id.button5);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Log.d("xinxi", "你点击了YuanHuView");            }        });    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {//重写activity的dispatchTouchEvent,return true或者是return false,则该activity上的任何view将不会响应任何触屏事件        Log.d("xinxi", "CeShiActivity--dispatchTouchEvent");        return super.dispatchTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                Log.d("xinxi", "CeShiActivity--触发ACTION_DOWN了");                break;            case MotionEvent.ACTION_MOVE:                Log.d("xinxi", "CeShiActivity--触发ACTION_MOVE了");                break;            case MotionEvent.ACTION_UP:                Log.d("xinxi", "CeShiActivity--触发ACTION_UP了");                break;        }        return super.onTouchEvent(event);    }}

在ZViewGroup.java文件中

public class ZViewGroup extends RelativeLayout {    public ZViewGroup(Context context) {        super(context);    }    public ZViewGroup(Context context, AttributeSet attrs) {        super(context, attrs);    }    public ZViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        Log.d("xinxi", "ZViewGroup--onInterceptTouchEvent");        return super.onInterceptTouchEvent(ev);    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        Log.d("xinxi", "ZViewGroup--dispatchTouchEvent");        return super.dispatchTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                Log.d("xinxi", "ZViewGroup--触发ACTION_DOWN了");                break;            case MotionEvent.ACTION_MOVE:                Log.d("xinxi", "ZViewGroup--触发ACTION_MOVE了");                break;            case MotionEvent.ACTION_UP:                Log.d("xinxi", "ZViewGroup--触发ACTION_UP了");                break;        }        return super.onTouchEvent(event);    }}

在YuanHuView.java文件中

public class YuanHuView extends View {    private Paint yuan;    private Paint wenZi;    private Paint yuanHu;    private float huDu=120;    public YuanHuView(Context context) {        super(context);    }    public YuanHuView(Context context, AttributeSet attrs) {        super(context, attrs);        yuan=new Paint();        yuan.setColor(Color.GREEN);        yuan.setStyle(Paint.Style.FILL);        wenZi=new Paint();        wenZi.setColor(Color.BLACK);        wenZi.setStyle(Paint.Style.FILL);        yuanHu=new Paint();        yuanHu.setColor(Color.RED);        yuanHu.setStrokeWidth(40);        yuanHu.setStyle(Paint.Style.STROKE);    }    public YuanHuView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.drawArc(getMeasuredWidth()/2-260,getMeasuredHeight()/2-260,getMeasuredWidth()/2+260,getMeasuredHeight()/2+260,0,huDu,false,yuanHu);        canvas.drawCircle(getMeasuredWidth()/2,getMeasuredHeight()/2,200,yuan);        canvas.drawText("我是文字",getMeasuredWidth()/2-10,getMeasuredHeight()/2-10,wenZi);    }    public void setHuDu(float huDu){        this.huDu=huDu;        invalidate();//执行该方法后,将会重新调用onDraw方法    }    @Override    public boolean dispatchTouchEvent(MotionEvent event) {        Log.d("xinxi", "YuanHuView--dispatchTouchEvent");        return super.dispatchTouchEvent(event);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                Log.d("xinxi", "YuanHuView--触发ACTION_DOWN了");                break;            case MotionEvent.ACTION_MOVE:                Log.d("xinxi", "YuanHuView--触发ACTION_MOVE了");                break;            case MotionEvent.ACTION_UP:                Log.d("xinxi", "YuanHuView--触发ACTION_UP了");                break;        }        return super.onTouchEvent(event);    }}
在所有的dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent都返回super的话,结果如下:
04-12 17:15:44.795 824-824/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:15:44.795 824-824/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:15:44.795 824-824/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:15:44.795 824-824/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:15:44.795 824-824/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_DOWN了04-12 17:15:44.805 824-824/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:15:44.805 824-824/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:15:44.805 824-824/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:15:44.805 824-824/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:15:44.805 824-824/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_UP了04-12 17:15:44.805 824-824/com.example.liang.lianxi D/xinxi: 你点击了YuanHuView
在所有的dispatchTouchEvent,onTouchEvent都返回super,onInterceptTouchEvent返回false的话,结果同上:
04-12 17:19:35.165 6452-6452/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:19:35.175 6452-6452/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:19:35.175 6452-6452/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:19:35.175 6452-6452/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:19:35.175 6452-6452/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_DOWN了04-12 17:19:35.245 6452-6452/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:19:35.245 6452-6452/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:19:35.245 6452-6452/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:19:35.245 6452-6452/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:19:35.255 6452-6452/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_UP了04-12 17:19:35.265 6452-6452/com.example.liang.lianxi D/xinxi: 你点击了YuanHuView
在所有的dispatchTouchEvent,onTouchEvent都返回super,onInterceptTouchEvent返回true的话,结果为:
04-12 17:27:52.835 22763-22763/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:27:52.845 22763-22763/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:27:52.845 22763-22763/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:27:52.845 22763-22763/com.example.liang.lianxi D/xinxi: ZViewGroup--触发ACTION_DOWN了04-12 17:27:52.845 22763-22763/com.example.liang.lianxi D/xinxi: CeShiActivity--触发ACTION_DOWN了04-12 17:27:52.935 22763-22763/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:27:52.935 22763-22763/com.example.liang.lianxi D/xinxi: CeShiActivity--触发ACTION_UP了
其他都返回super,只有ZViewGroup的dispatchTouchEvent方法返回true的话,结果为:
04-12 17:31:28.455 27897-27897/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:31:28.455 27897-27897/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:31:28.515 27897-27897/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:31:28.515 27897-27897/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent
其他都返回super,只有ZViewGroup的dispatchTouchEvent方法返回false的话,结果为:
04-12 17:33:42.095 789-789/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:33:42.095 789-789/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:33:42.095 789-789/com.example.liang.lianxi D/xinxi: CeShiActivity--触发ACTION_DOWN了04-12 17:33:42.195 789-789/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:33:42.195 789-789/com.example.liang.lianxi D/xinxi: CeShiActivity--触发ACTION_UP了
其他都返回super,只有ZViewGroup的onTouchEvent方法返回true的话,结果为:
04-12 17:36:24.425 5125-5125/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:36:24.425 5125-5125/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:36:24.425 5125-5125/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:36:24.425 5125-5125/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:36:24.425 5125-5125/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_DOWN了04-12 17:36:24.545 5125-5125/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:36:24.545 5125-5125/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:36:24.545 5125-5125/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:36:24.545 5125-5125/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:36:24.555 5125-5125/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_UP了04-12 17:36:24.565 5125-5125/com.example.liang.lianxi D/xinxi: 你点击了YuanHuView
其他都返回super,只有ZViewGroup的onTouchEvent方法返回false的话,结果为:
04-12 17:40:38.315 13699-13699/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:40:38.315 13699-13699/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:40:38.315 13699-13699/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:40:38.315 13699-13699/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:40:38.315 13699-13699/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_DOWN了04-12 17:40:38.445 13699-13699/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:40:38.445 13699-13699/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:40:38.445 13699-13699/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:40:38.445 13699-13699/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:40:38.445 13699-13699/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_UP了04-12 17:40:38.445 13699-13699/com.example.liang.lianxi D/xinxi: 你点击了YuanHuView
其他都返回super,只有YuanHuView的dispatchTouchEvent方法返回true的话,结果为:
04-12 17:45:59.835 23834-23834/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:45:59.835 23834-23834/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:45:59.835 23834-23834/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:45:59.835 23834-23834/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:45:59.895 23834-23834/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:45:59.895 23834-23834/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:45:59.895 23834-23834/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:45:59.895 23834-23834/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent
其他都返回super,只有YuanHuView的dispatchTouchEvent方法返回false的话,结果为:
04-12 17:54:38.775 3957-3957/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:54:38.775 3957-3957/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 17:54:38.775 3957-3957/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 17:54:38.775 3957-3957/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 17:54:38.775 3957-3957/com.example.liang.lianxi D/xinxi: ZViewGroup--触发ACTION_DOWN了04-12 17:54:38.775 3957-3957/com.example.liang.lianxi D/xinxi: CeShiActivity--触发ACTION_DOWN了04-12 17:54:38.835 3957-3957/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 17:54:38.835 3957-3957/com.example.liang.lianxi D/xinxi: CeShiActivity--触发ACTION_UP了
其他都返回super,只有YuanHuView的onTouchEvent方法返回true的话,结果为:
04-12 18:00:39.215 14397-14397/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 18:00:39.215 14397-14397/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 18:00:39.215 14397-14397/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 18:00:39.215 14397-14397/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 18:00:39.215 14397-14397/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_DOWN了04-12 18:00:39.345 14397-14397/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 18:00:39.345 14397-14397/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 18:00:39.345 14397-14397/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 18:00:39.345 14397-14397/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 18:00:39.345 14397-14397/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_UP了
其他都返回super,只有YuanHuView的onTouchEvent方法返回false的话,结果为:
04-12 18:03:39.355 22402-22402/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 18:03:39.355 22402-22402/com.example.liang.lianxi D/xinxi: ZViewGroup--dispatchTouchEvent04-12 18:03:39.355 22402-22402/com.example.liang.lianxi D/xinxi: ZViewGroup--onInterceptTouchEvent04-12 18:03:39.355 22402-22402/com.example.liang.lianxi D/xinxi: YuanHuView--dispatchTouchEvent04-12 18:03:39.355 22402-22402/com.example.liang.lianxi D/xinxi: YuanHuView--触发ACTION_DOWN了04-12 18:03:39.355 22402-22402/com.example.liang.lianxi D/xinxi: ZViewGroup--触发ACTION_DOWN了04-12 18:03:39.355 22402-22402/com.example.liang.lianxi D/xinxi: CeShiActivity--触发ACTION_DOWN了04-12 18:03:39.445 22402-22402/com.example.liang.lianxi D/xinxi: CeShiActivity--dispatchTouchEvent04-12 18:03:39.445 22402-22402/com.example.liang.lianxi D/xinxi: CeShiActivity--触发ACTION_UP了

心得:当view的onTouchEvent事件return true,view就获取了事件,这是需要在onTouchEvent方法中对事件的类型进行分类处理,如果不进行处理的话,那么这个view将不会触发任何事件,比如单击,双击,长按等等,因为你的onTouchEvent事件return true了,而不是return super.onTouchEvent(event),所以需要在onTouchEvent方法中进行事件的重新绑定,代码如下:

public class ZButton extends Button {    private OnClickListener onClickListener;    public ZButton(Context context) {        super(context);    }    public ZButton(Context context, AttributeSet attrs) {        super(context, attrs);    }    public ZButton(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    public void setOnClickListener(OnClickListener l) {        onClickListener=l;    }    @Override    public boolean onTouchEvent(MotionEvent event) {//当view的onTouchEvent事件return true,view就获取了事件,这是需要        // 在onTouchEvent方法中对事件的类型进行分类处理,如果不进行处理的话,那么这个view将不会触发任何事件,比如单击,        // 双击,长按等等,因为你的onTouchEvent事件return true了,而不是return super.onTouchEvent(event),所以需要在onTouchEvent        //方法中进行事件的重新绑定        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                //onClickListener.onClick(this);自己进行单击事件的绑定                callOnClick();//调用系统的单击事件绑定                break;        }        return true;    }    @Override    public boolean dispatchTouchEvent(MotionEvent event) {        return super.dispatchTouchEvent(event);    }}

图形总结:

文字总结:

1:都返回super那么就是一个U形图,所有的方法都会走一遍;
2:dispatchTouchEvent方法和onTouchEvent方法一样:返回true为消费,false为调用父View的onTouchEvent(除了activity的dispatchTouchEvent和onTouchEvent);
3:onInterceptTouchEvent方法:返回true为调用ViewGroup的onTouchEvent,false为调用子View的dispatchTouchEvent;

参考文章如下:
https://www.jianshu.com/p/e99b5e8bd67b

更多相关文章

  1. Android图形绘制基础(一)
  2. 将获取的html源代码格式化输出
  3. Android(安卓)调用H5界面(交互)
  4. InputFilter方法filter 解释
  5. 左上角返回键
  6. Android工程方法数超过65535,解决办法
  7. SQLiteDatabaseTest
  8. 给Android标题栏加上返回按钮
  9. android 之 3G/gprs

随机推荐

  1. Android animation-list动画
  2. smack 源码分析- PacketWriter (android
  3. APP横竖屏不切换,不重走生命周期
  4. android相关技术文档汇总
  5. android隐藏IME(输入法)输入框
  6. android 延时 不用另起线程或timertask
  7. Android用户界面开发(11):Menu
  8. Android错误解决方法大集合
  9. Android下拉刷新和上拉加载更多
  10. Android基础知识之API等级介绍