Android中的Touch事件处理如何去掉这种警告

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中的Touch事件处理如何去掉这种警告相关的知识,希望对你有一定的参考价值。

用注解吧 打个@SuppressLint("ClickableViewAccessibility")
这个警告是说,有可能会和点击事件发生冲突
如果你在touch中返回了true,那么就不会响应onClick事件了
你必须调用一下view.performClick(),才会触发
view.setOnTouchListener(new View.OnTouchListener()
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event)
// TODO Auto-generated method stub
return false;

);
参考技术A 首先要弄明白这里为什么要警告,api上说,如果view注册了touch事件,则有可能会影响这个控件的onClick事件。为了解决和单击事件冲突:
1. 要给view注册touch事件。
2. 在touch中增加 case MotionEvent.ACTION_UP:
3. 调用一下view.performClick();。
4. 或者直接增加一个注释@SuppressLint("ClickableViewAccessibility") 去掉警告。

Android touch事件分发

跟touch事件相关的3个方法:
public boolean dispatchTouchEvent(MotionEvent ev); //用来分派event
public boolean onInterceptTouchEvent(MotionEvent ev); //用来拦截event
public boolean onTouchEvent(MotionEvent ev); //用来处理event
三个方法的用法:
dispatchTouchEvent() 用来分派事件
其中调用了onInterceptTouchEvent()和onTouchEvent()一般不重写该方法
onInterceptTouchEvent() 用来拦截事件。
ViewGroup类中的源码实现就是{return false;}表示不拦截该事件,
事件将向下传递(传递给其子View);
若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递
事件由当前ViewGroup类来处理,就是调用该类的onTouchEvent()方法
onTouchEvent() 用来处理事件。
返回true则表示该View能处理该事件,事件将终止向上传递(传递给其父View);
返回false表示不能处理,则把事件传递给其父View的onTouchEvent()方法来处理
【注】:ViewGroup的某些子类(GridView、ScrollView…)重写了onInterceptTouchEvent()方法,当发生ACTION_MOVE事件时,返回true进行拦截。

 

拥有这三个方法的类:
Activity        :dispatchTouchEvent();                 onTouchEvent();
ViewGroup       :dispatchTouchEvent();   onInterceptTouchEvent();     onTouchEvent();
View         :dispatchTouchEvent();                 onTouchEvent();

 

现在重写  activity ViewGroup  View 的相应方法,构造布局。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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">

    <com.event.MyViewGroup
        android:id="@+id/myViewGroup"
        android:background="@color/colorPrimary"
        android:layout_width="400dp"
        android:layout_height="400dp">

        <com.event.MyView
            android:id="@+id/myView"
            android:layout_width="200dp"
            android:layout_height="200dp" />
    </com.pig.event.MyViewGroup>


</android.support.constraint.ConstraintLayout>

 

1、点击空白处(activity),输出:

activity   dispatchTouchEvent: 
activity   onTouchEvent: 

直接点击  activity  触发  activity相应方法。与 内部控件无关

2、点击蓝色部分(ViewGroup),输出:(当我们手动设置OnTouchListener  并且返回true时,会拦截事件, onTouchEvent不会触发   )

 activity   dispatchTouchEvent: 
 group dispatchTouchEvent: 
 group  onInterceptTouchEvent: 
 group  onTouch:  (OnTouchListener 部分)
 group onTouchEvent: 
 activity   onTouchEvent: 

(1)由于activity没有拦截事件的方法,事件肯定会传进ViewGroup。

 (2)ViewGroup 中的onTouchEvent 默认返回fasle  表示事件未处理完,则会触发activity的onTouchEvent

3、点击按钮(View),输出:(当我们手动设置OnTouchListener  并且返回true时,会拦截事件, onTouchEvent不会触发   )

 activity   dispatchTouchEvent: 
 group dispatchTouchEvent: 
 group  onInterceptTouchEvent: 
 view   dispatchTouchEvent: 
 view   onTouch: (OnTouchListener 部分)
 view  onTouchEvent: 

(1)activity分发事件进ViewGroup ,ViewGroup分发事件时,选择是否拦截事件,若不拦截则分发事件到View,若拦截事件,ViewGroup自己将事件处理,View不会接收到事件。

 (2)view 的onTouchEvent默认返回true ,表示事件以处理完,不会触发ViewGroup  和 activity 的onTouchEvent。

 

 

 

 

以上是关于Android中的Touch事件处理如何去掉这种警告的主要内容,如果未能解决你的问题,请参考以下文章

Android中的Touch事件处理如何去掉这种警告

Android中的Touch事件处理如何去掉这种警告

Android Touch事件分发处理机制详解

Android的Touch事件处理机制

Android Touch事件传递机制解析 (推荐)

Android Touch事件传递机制解析