关于安卓View的setEnabled和setClickable的思考

来源:互联网 发布:剑灵秦夕妍捏脸数据 编辑:程序博客网 时间:2024/04/29 07:17

我们讲结合setOnClickListener和setOnTouchListener以及setEnabled和setClickable的相互影响。

以及View遮盖是否能穿透事件进行分析阐述。

首先我们搞一个布局:

<?xml version="1.0" encoding="utf-8"?><com.example.airy.click.R1    android:id="@+id/r1"    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="com.example.airy.click.MainActivity">    <ImageView        android:id="@+id/im1"        android:background="#123123"        android:layout_width="100dp"        android:layout_height="100dp" />    <ImageView        android:id="@+id/im2"        android:alpha="0.5"        android:background="#afd1c1"        android:layout_width="200dp"        android:layout_height="200dp" /></com.example.airy.click.R1>

m2位于m1的上层且比m1更大。两者都在一个自定义的R1 extends RelativeLayout中。

首先场景1

二者都注册setOnClickListener。结果是m2可以触发,m1不可以。这很简单。

场景2

如果我们不希望m2被点击,那么我们在场景1的基础上

imageView2.setEnabled(false);

我们测试发现,m2的点击不会触发,m1同样也不会。

场景3

imageView2.setClickable(false);

使用这种方式解除m2的点击,

我们测试发现m2所覆盖下的m1区域是可以被触发点击的。
实战场景
【如果我们需要上层覆盖VIEW不可被点击并且要将点击事件穿透下去,我们选用setClickable方法】
如果我们需要上层覆盖VIEW不可被点击并且不需要将点击事件穿透下去,我们选用setEnabled方法】

接下来

场景4

我们给m2追加注册setOnTouchListener事件。并且禁止setClickable

imageView2.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                showtoast("onTouch22");                return true;            }        }); imageView2.setClickable(false);

结果是如果OnTouchListener return ture那么事件会被m2吃掉。m1点击事件不会穿透,如果return false那么事件将会穿透m1会触发点击。但是对于m2的setOnTouchListener只能接受到一个down事件并不能接收到完整的事件序列。

场景5

基于场景4变为

  imageView2.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                showtoast("onTouch22");                return true;            }        });       imageView2.setEnabled(false);

测试结果,无论retrun true和false,setOnClickListener和setOnTouchListener方法都不会被调用,m1也接受不到任何事件。

实战场景

【VIEW不可被点击并且setOnTouchListener不被调用且事件不穿透下去可以使用setEnabled】

知识点比较基础,但再项目实战中相对实用。从view事件分发的角度确实也可以解释这几个现象,最近博主也是在做一个广告浮层类似的东西总结出的经验和大家分享。

哪里可以找到我:

我的Github: https://github.com/AndroidMsky

我的博客主页: http://blog.csdn.net/androidmsky

欢迎加作者自营安卓开发交流群:

308372687

这里写图片描述

阅读全文
0 0