Android进阶之路 - onTouch从简入繁

借鉴文章:

正文

  • onTouchEvent是activity中的方法
    这里写图片描述

概念:
onTouchEvent是手机屏幕事件的处理方法,是获取的对屏幕的各种操作,比如向左向右滑动,点击返回按钮等等。属于一个宏观的屏幕触摸监控。onTouchEvent方法是override 的Activity的方法。重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会被调用

  • onTouch是view中的接口回调的方法
    这里写图片描述

概念:
onTouch()是OnTouchListener接口的方法,它是获取某一个控件的触摸事件,因此使用时,必须使用setOnTouchListener绑定到控件,然后才能鉴定该控件的触摸事件。当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。通过getAction()方法可以获取当前触摸事件的状态:

  • ACTION_DOWN:表示按下了屏幕的状态。
  • ACTION_MOVE :表示为移动手势
  • ACTION_UP :表示为离开屏幕
  • ACTION_CANCEL :表示取消手势,不会由用户产生,而是由程序产生的

场景 :
在同个Activity下实现onTouch方法与重写onTouchEvent方法

分析 :

package com.example.yongliu.onthouchstudy;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView mBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtn = findViewById(R.id.btn);

        mBtn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
               Toast.makeText(MainActivity.this,"控件内部的触摸事件 ACTION",Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Toast.makeText(MainActivity.this,"控件之外的触摸事件",Toast.LENGTH_SHORT).show();
        return super.onTouchEvent(event);
    }
}
package com.example.yongliu.onthouchstudy;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView mBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtn = findViewById(R.id.btn);

        mBtn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        Toast.makeText(MainActivity.this,"控件内部的触摸事件 ACTION_DOWN",Toast.LENGTH_SHORT).show();

                        break;

                    case MotionEvent.ACTION_UP:
                        Toast.makeText(MainActivity.this,"控件内部的触摸事件 ACTION_UP",Toast.LENGTH_SHORT).show();
                        break;
                }
                return true;
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Toast.makeText(MainActivity.this,"控件之外的触摸事件",Toast.LENGTH_SHORT).show();
        return super.onTouchEvent(event);
    }
}

二者区别:
1、如果setOnTouchListener中的onTouch方法返回值是true(事件被消费)时,则onTouchEvent方法将不会被执行;
2、只有当setOnTouchListener中的onTouch方法返回值是false(事件未被消费,向下传递)时,onTouchEvent方法才被执行。
3、以上说的情况适用于View对象(事件会最先被最内层的View对象先响应)而不是ViewGroup对象(事件会最先被最外层的View对象先响应)。

综合来讲:
onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发

猜你喜欢

转载自blog.csdn.net/qq_20451879/article/details/80083874