首页 > 系统 > Android > 正文

android点击事件与触摸事件

2019-11-09 15:45:42
字体:
来源:转载
供稿:网友

写这篇文章,一来和大家分享交流,二来相当于是自己的总结。

android控件的事件主要包含click事件和touch事件。

一.首先看一下这两个事件的顺序

贴代码布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.ls.studyapplication.MainActivity">    <LinearLayout        android:id="@+id/linearLayout"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="#FFDEAD"        android:gravity="center"        android:orientation="horizontal">        <Button            android:id="@+id/button"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="Button" />    </LinearLayout> </RelativeLayout>activity中的代码

package com.ls.studyapplication;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {    PRivate Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView(){        button= (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Log.e("MainActivity","=====button点击事件");            }        });        button.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                Log.e("MainActivity","=====button触摸事件"+event);                return false;            }        });    }}点击按钮,打印出来的日志

可以看出,设置点击监听和触摸监听的情况下,先执行的是触摸监听。

二.如果把button的触摸监听返回ture

button.setOnTouchListener(new View.OnTouchListener() {       @Override       public boolean onTouch(View v, MotionEvent event) {            Log.e("MainActivity","=====button触摸事件"+event);            return true;       }});

再次点击按钮,结果如下:

可以看到,这时点击事件不响应了,具体原因我们从源码分析分析:

 /**     * Pass the touch screen motion event down to the target view, or this     * view if it is the target.     *     * @param event The motion event to be dispatched.     * @return True if the event was handled by the view, false otherwise.     */    public boolean dispatchTouchEvent(MotionEvent event) {        // If the event should be handled by accessibility focus first.        if (event.isTargetAccessibilityFocus()) {            // We don't have focus or no virtual descendant has it, do not handle the event.            if (!isAccessibilityFocusedViewOrHost()) {                return false;            }            // We have focus and got the event, then use normal event dispatch.            event.setTargetAccessibilityFocus(false);        }        boolean result = false;        if (mInputEventConsistencyVerifier != null) {            mInputEventConsistencyVerifier.onTouchEvent(event, 0);        }        final int actionMasked = event.getActionMasked();        if (actionMasked == MotionEvent.ACTION_DOWN) {            // Defensive cleanup for new gesture            stopNestedScroll();        }        if (onFilterTouchEventForSecurity(event)) {            if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {                result = true;            }            //noinspection SimplifiableIfStatement            ListenerInfo li = mListenerInfo;            if (li != null && li.mOnTouchListener != null                    && (mViewFlags & ENABLED_MASK) == ENABLED                    && li.mOnTouchListener.onTouch(this, event)) {                result = true;            }            if (!result && onTouchEvent(event)) {                result = true;            }        }        if (!result && mInputEventConsistencyVerifier != null) {            mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);        }        // Clean up after nested scrolls if this is the end of a gesture;        // also cancel it if we tried an ACTION_DOWN but we didn't want the rest        // of the gesture.        if (actionMasked == MotionEvent.ACTION_UP ||                actionMasked == MotionEvent.ACTION_CANCEL ||                (actionMasked == MotionEvent.ACTION_DOWN && !result)) {            stopNestedScroll();        }        return result;    }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表