首页 > 其他分享 >onInterceptTouchEvent() 与 onTouch() 事件分析

onInterceptTouchEvent() 与 onTouch() 事件分析

时间:2024-07-03 14:58:01浏览次数:16  
标签:case MotionEvent onInterceptTouchEvent break println onTouch 事件 ACTION

前言

本文主要分析 onTouch() 与 onTouchEvent() 事件的差异

正文

先看布局文件:

<?xml version="1.0" encoding="utf-8"?>
<com.longzhiye.intercepttouch.MyFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/tv"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#000000"
        android:text="Hello World!"
       />
</com.longzhiye.intercepttouch.MyFrameLayout>

MyFrameLayout 是一个自定义View:

public class MyFrameLayout extends FrameLayout  {
    public MyFrameLayout(@NonNull Context context) {
        super(context);
    }
    public MyFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public MyFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                System.out.println("----onInterceptTouchEvent---ACTION_DOWN");
                return true;
           //     break;
            case MotionEvent.ACTION_POINTER_UP:
                System.out.println("----onInterceptTouchEvent---ACTION_POINTER_UP");
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                System.out.println("----onInterceptTouchEvent---ACTION_POINTER_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.println("----onInterceptTouchEvent---ACTION_MOVE");
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                System.out.println("----onInterceptTouchEvent---ACTION_UP");
                break;
            default:
                throw new IllegalStateException("Unexpected value: " + event.getActionMasked());
        }
        return false;
    }
}

MainActivity:

public class MainActivity extends AppCompatActivity  {
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.tv);
        textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        System.out.println("----onTouch---ACTION_DOWN");
                    break;
                    case MotionEvent.ACTION_POINTER_UP:
                        System.out.println("----onTouch---ACTION_POINTER_UP");
                        break;
                    case MotionEvent.ACTION_POINTER_DOWN:
                        System.out.println("----onTouch---ACTION_POINTER_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        System.out.println("----onTouch---ACTION_MOVE");
                        break;
                    case MotionEvent.ACTION_CANCEL:
                    case MotionEvent.ACTION_UP:
                        System.out.println("----onTouch---ACTION_UP");
                        break;
                    default:
                        throw new IllegalStateException("Unexpected value: " + motionEvent.getActionMasked());
                }
                return true;
            }
        });
    }
}

好了,开始进行分析:

当 onInterceptTouchEvent 事件返回 true,ViewGroup会将该事件进行拦截,无法向下(View)传递。在 onTouch 中将收不到事件。
当 onTouch 事件返回 true,则表明事件不再向下传递,自己处理,消耗掉,例子:该view的 onClick 事件将会失效。

ViewGroup事件传递总结

View事件传递总结

这里需要特别注意的是,onTouch()的执行 先于onClick()。

标签:case,MotionEvent,onInterceptTouchEvent,break,println,onTouch,事件,ACTION
From: https://blog.csdn.net/u010345983/article/details/135571310

相关文章

  • 【Unity】EventTrigger各事件触发时机解释
    OnSelect():当鼠标按下了一个当前未在选中状态的UI时触发。如果一个UI已经被选中(成为焦点UI),那么再点击这个UI时,则不会再一次触发OnSelect。OnDeselect():在OnSelect()已经执行过之后,又选中了另外一个物体时,原有的物体就会触发OnDeselect(),取消选择。OnUpdateSelect():在......
  • Simple WPF: WPF 透明窗体和鼠标事件穿透
    一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能。可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应。这个方法不一定是制作WPF透明窗体最合适的方法,请各路大大不要喷。完整代码地址:Github一、去除......
  • 项目随笔-【大事件(文章类)】
    项目随笔-【大事件(文章类)】自定义参数校验注解需要写一个自定义注解Xxx+校验规则的类XxxValidation【需要继承ConstraintValidator】自定义注解@Documented@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy={StateValidation.clas......
  • 如何刻画复杂事件
    前言复杂事件的刻画✍️[网摘整理]设\(A\),\(B\)是试验\(E\)的随机事件,深入体会用基本事件的和或积的运算来刻画复杂事件,并熟练掌握:①\(A\)发生:\(A=AB+A\bar{B}\);②只有\(A\)发生:\(A\bar{B}\);③\(A\),\(B\)恰有一个发生:\(A\bar{B}\)+\(\bar{A}B\);④\(A\),\(B\)同时发......
  • 如何避免 `click` 和 `mousedown` 事件之间的冲突
    Genie你好!为了避免click和mousedown事件之间的冲突,可以通过检查拖拽的状态来决定是否应触发click事件。我们可以设置一个简单的延迟,并使用一个标志位来确定是否应该忽略click事件。下面是修改后的代码:<script>const{remote,ipcRenderer}=require('electron'......
  • 【Unity&&C#】委托与事件笔记
    委托委托的定义委托是个类,分为Delegate自定义委托类型,Func有返回值的委托类型,Action无返回值的委托类型Func和Action的底层原理便是用Delegate声明一个委托类型(有返回值和无返回值),并且通过泛型参数(最多十六个)来实现自定义参数类型和参数委托的两种使用情况:模板方法(一般是......
  • Android 事件分发机制详解(下)
    2.3View事件分发机制从上面ViewGroup事件分发机制知道,View事件分发机制从dispatchTouchEvent()开始源码分析/***源码分析:View.dispatchTouchEvent()*/publicbooleandispatchTouchEvent(MotionEventevent){if((mViewFlags&ENABLED_MASK)......
  • 03_组件、事件、插槽、发布订阅
    文档:组件基础|Vue.js(vuejs.org)什么是组件:vue组件可以将一个复杂的应用程序(或者是页面)拆分成多个小的模块,每个模块可以独立的进行开发和测试。在Vue当中组件是通过虚拟DOM来实现的,可以将复杂的页面拆分多个小的DOM节点,每个节点对应一个组件,然后这些组件组合成一个完整的页......
  • 【Netty】nio处理accept&read&write事件
          ......
  • win32 低内存通知事件
    在Windows机制里面,将在物理内存、换页池、非换页池以及提交用量很多或很少时,向用户模式进程和内核模式驱动程序提供通知。本文将重点放在用户模式的进程上本文属于读《深入解析Windows操作系统》读书笔记应用程序可以调用CreateMemoryResourceNotificationfunction函数......