美文网首页
View 的事件处理

View 的事件处理

作者: 王世军Steven | 来源:发表于2016-12-14 09:12 被阅读19次

如果View处理事件流程

1. 如果设置了onTouchListener 首先执行onTouchListener 中的onTouch 方法,根据onTouch 的返回值进行其他操作.


(1) 如果onTouch返回了true 则View的onTouchEvent 不会被调用.

// onTouch 返回 true
// 按下按钮时
D/MainActivity: onTouch: ACTION_DOWN
// 松开按钮时
D/MainActivity: onTouch: ACTION_UP

(2) 如果onTouch 返回了false. 则View的onTouchEvent()将会被执行 .测试如果设置了OnClickListener 则 OnClickListener中的onClick() 方法将会被执行 .也就是说onClickListener的优先级最低.

// onTouch 返回false
// 按下按钮时
D/MainActivity: onTouch: ACTION_DOWN
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被调用
// 松开按钮时
D/MainActivity: onTouch: ACTION_UP
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被调用
D/MainActivity: onClick: 执行

2. 如果没有设置onTouchListener则默认和onTouch返回false的情况一样.

// 没有设置OnTouchListener
// 按钮被按下
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被调用
// 松开按钮时
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被调用
D/MainActivity: onClick: 执行

测试代码

自定义Button

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button;
/**
 * 测试View事件的自定义Button
 * Created by WSJ on 2016/12/14.
 */
public class WSJButton_01 extends Button {
    private static final String TAG = "WSJButton_01";
    public WSJButton_01(Context context) {
        this(context,null);
    }
    public WSJButton_01(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public WSJButton_01(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Log.d(TAG,"构造方法被调用");
    }                                                                                              
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "onTouchEvent: ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "onTouchEvent: ACTION_UP");
                break;
        }
        return super.onTouchEvent(event);
    }
}

Button设置Listener

        mButtonTest = (Button) findViewById(R.id.btn_test_event);

        mButtonTest.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        Log.d(TAG, "onTouch: ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.d(TAG, "onTouch: ACTION_UP");
                        break;
                }
                // 返回 false onTouchEvent 将会执行.----> onClick 也会执行
                return false;
                // 返回 true onTouchEvent将不会被调用.
//                return true;
            }
        });
        mButtonTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: 执行");
            }
        });

相关文章

  • ios事件处理

    ios 事件处理 先要找到合适的view来处理事件,找view的过程为先通过hitTest 判断当前的view...

  • 事件传递机制

    View接收到事件,如果view不能处理该事件,并且她不是顶层的view,则会将事件往他的父view进行传递; 父...

  • 安卓事件传递机制

    事件传递机制 View dispatchTouchEvent():分发事件 onTouchEvent():处理事件...

  • View 事件处理

    View 1.View 事件体系 1.1 基础知识 位置参数getRawX() / getRawY() //获取当...

  • View 的事件处理

    如果View处理事件流程 1. 如果设置了onTouchListener 首先执行onTouchListener ...

  • Chapter 07. Broadcast

    阅读原文 7.1 . 理论概述 广播事件处理属于系统级的事件处理(一般事件处理是属于View级的事件处理) 一个应...

  • 滑动冲突的处理

    简单来说,处理滑动冲突,主要还是对view的事件分发的拦截的处理,原则就是 哪个view需要响应对应的滑动事件,就...

  • Android事件分发

    在看事件分发之前,先看一下View、ViewGroup、Activity的对Touch事件的处理。 一、View对...

  • View单击事件处理

    View点击事件处理方式两种方式: 设置View标签的属性onClick的值,将值作为方法名,在方法中处理点击事件...

  • 自定义View入门(七) - 监听

    本章目录 Part One:自定义View的点击事件 Part Two:点击事件处理 自定义View的点击事件 官...

网友评论

      本文标题:View 的事件处理

      本文链接:https://www.haomeiwen.com/subject/pscimttx.html