public boolean onInterceptTouchEvent (MotionEvent ev)

  Implement this method to intercept all touch screen motion events. This allows you to watch events as they are dispatched to

your children, and take ownership of the current gesture at any point.

  Using this function takes some care, as it has a fairly complicated interaction with View.onTouchEvent(MotionEvent), and using it

requires implementing that method as well as this one in the correct way. Events will be received in the following order:

  1)You will receive the down event here.

  2)The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle;

this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture.   Also, by

returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing

must happen in onTouchEvent() like normal.

  3)For as long as you return false from this function, each following event  will be delivered first here and then to the target's

onTouchEvent().

  4)If you return true from here, you will not receive any following events. the target view will receive the same event but with

the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.

  1)在 onInterceptTouchEvent()接收到down事件

  2)ViewGroup 或者 ViewGroup里面的 View 都可以处理 down事件

  3)只要onInterceptTouchEvent()返回false, 则剩下的事件都会先发送到onInterceptTouchEvent(),再发送到目标对象的onTouchEvent()

  4)如果onInterceptTouchEvent()返回true, 则剩下的事件不会发送到ViewGroup 的 onInterceptTouchEvent()和目标对象的onTouchEvent()

只会发送给ViewGroup 的 onTouchEvent()

 Returns:

  • Return true to steal motion events from the children and have them dispatched to this ViewGroup through onTouchEvent().

The current target will receive an ACTION_CANCEL event, and no further messages will be delivered here.

返回true会调用ViewGroup的onTouchEvent()。

一。实验代码

1.ViewGroup

public class GlingLayout extends FrameLayout {

    private static String tag = GlingLayout.class.getSimpleName();

    public GlingLayout(Context context){
super(context);
} public GlingLayout(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(tag, " --- down");
break;
case MotionEvent.ACTION_MOVE:
Log.e(tag, " --- move");
break;
case MotionEvent.ACTION_UP:
Log.e(tag, " --- up");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(tag, " --- cancel");
break;
default:
break;
}
return false;
} @Override
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(tag, " --------------------- down");
break;
case MotionEvent.ACTION_MOVE:
Log.e(tag, " ------------------ move");
break;
case MotionEvent.ACTION_UP:
Log.e(tag, " ----------------- up");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(tag, " ----------------- cancel");
break;
default:
break;
}
return true;
}
}

2.View

package com.gl;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button; public class GlingButton extends Button { private static String tag = GlingButton.class.getSimpleName(); public GlingButton(Context context){
super(context);
} public GlingButton(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(tag, " down ---------------");
break;
case MotionEvent.ACTION_MOVE:
Log.e(tag, " move --------------- ");
break;
case MotionEvent.ACTION_UP:
Log.e(tag, " up ---------------");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(tag, " cancel ---------------");
break;
default:
break;
}
return true;
} }

二.结果

1.onInterceptTouchEvent返回false时

2.1.onInterceptTouchEvent返回true时

三。让ViewGroup不能截断TouchEvent

public void requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Called when a child does not want this parent and its ancestors to intercept touch events with onInterceptTouchEvent(MotionEvent).

This parent should pass this call onto its parents. This parent must obey this request for the duration of the touch (that is, only clear the flag after this parent has received an up or a cancel.

Parameters

Android ViewGroup onInterceptTouchEvent的更多相关文章

  1. ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明

    今天抽出了一些时间实践了viewgroup和view的触摸事件顺序,之前也试过,总是忘记,今天记下笔记说明一下 首先 onInterceptTouchEvent只会出现在viewgroup中,view ...

  2. Android在onInterceptTouchEvent与onTouchEvent

    onInterceptTouchEvent: onInterceptTouchEvent是在ViewGroup里面定义的.Android中的layout布局类一般都是继承此类的.onIntercept ...

  3. Android中onInterceptTouchEvent、dispatchTouchEvent及onTouchEvent的调用顺序及内部原理

    在Android中需要经常对用户手势进行判断,在判断手势时需要精细的分清楚每个触摸事件以及每个View对事件的接收情况,在View,ViewGroup,Activity中都可以接收事件,在对事件进行处 ...

  4. Android ViewGroup拦截触摸事件具体解释

    前言 在自己定义ViewGroup中.有时候须要实现触摸事件拦截.比方ListView下拉刷新就是典型的触摸事件拦截的样例. 触摸事件拦截就是在触摸事件被parent view拦截,而不会分发给其ch ...

  5. android ViewGroup事件分发机制

    1:事件分销过程 自定义一个LinearLayout,重写dispatchTouchEvent onInterceptTouchEvent onTouchEvent,定义一个按键重写dispathcT ...

  6. Android -- ViewGroup源码分析+自定义

    1,我们前三篇博客了解了一下自定义View的基本方法和流程 从源码的角度一步步打造自己的TextView 深入了解自定义属性 onMeasure()源码分析 之前,我们只是学习过自定义View,其实自 ...

  7. Android ViewGroup等容器控件的使用

    在Android中,可以自定义类,继承ViewGroup等容器类,以实现自己需要的布局显示.如果你在ViewGroup中增加了控件,却无法显示出 来,那么下面这个例子,就可以用来参考了.(主要是要实现 ...

  8. Android ViewGroup使用小结

    ViewGroup定义 在api中是这么描写叙述ViewGroup的:A ViewGroup is a special view that can contain other views. 依据意思我 ...

  9. Android ViewGroup点击效果(背景色)

    在开发Android应用的界面时,我们必然会用到本文ViewGroup,尤其是FrameLayout,LinearLayout,RelativeLayout等ViewGroup的子类: 在一些情况下, ...

随机推荐

  1. 使用randA()生成randB()

    randA()表示可以随机生成1--A的整数 rand7()生成rand5() int Rand5(){ int x = ~(1<<31); // max int while(x > ...

  2. hdu6000 Wash 巧妙地贪心

    /** 题目:hdu6000 Wash 巧妙地贪心 链接:https://vjudge.net/contest/173364#problem/B 转自:http://blog.csdn.net/ove ...

  3. C++ 类的继承六(多继承的二义性--虚基类)

    //多继承的二义性--虚基类(了解为主) #include<iostream> using namespace std; /* 多继承在现在的项目开发中一般不使用,他会增加项目的复杂度 * ...

  4. 在同一台电脑上添加多个ssh key

    1.创建新的ssh key: ssh-keygen -t rsa -C "your_email@email.com" 然后让你输入新的文件名称,这里设置为new # 设置名称为En ...

  5. ApexSql Log 2016破解版&补丁

    绿色破解版: http://download.csdn.net/detail/gsyifan/9316993 官网: https://www.apexsql.com/sql_tools_log.asp ...

  6. 第二百零八节,jQuery EasyUI,SplitButton(分割按钮菜单)组件

    jQuery EasyUI,SplitButton(分割按钮)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 SplitButton(分割按钮)组件的使用 ...

  7. 当您尝试再次安装 SQL Server 时,SQL Server 2008年安装将会失败

    症状 当您尝试在一台服务器上安装 Microsoft SQL Server 2008年时,则安装将失败.当您尝试在同一台服务器上重新安装 SQL Server 2008年的相同副本时,此安装也将失败. ...

  8. 蓝桥杯 第四届C/C++预赛真题(3) 第39级台阶(递归)

    题目标题: 第39级台阶 小明刚刚看完电影<第39级台阶>,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台阶 ...

  9. MSDN--ASP.NET概述

    https://msdn.microsoft.com/zh-cn/library/4w3ex9c2(v=vs.100).aspx

  10. oralce 术语

    §2.1 术语 l 数据库块(BLOCK) ORACLE 数据库中的最小存储和处理单位,包含块本身的头信息数据或PL/SQL代码. ORACLE 块的大小是可以在安装时选择“自定义安装”来指定,也可以 ...