手把手教你Android全局触摸事件监听

yizhihongxing

手把手教你Android全局触摸事件监听

在Android开发中,对于某些需要全局响应的触摸事件,我们需要对整个Activity设置触摸事件监听器。本文将手把手地教你如何在Android中实现全局触摸事件的监听。

实现原理

在Android中,我们可以通过在Activity中重写onTouchEvent()方法来监听触摸事件。onTouchEvent()方法接收一个MotionEvent对象,该对象封装了事件的各种详细信息,如事件类型、触摸点坐标等。因此我们可以通过解析MotionEvent对象的信息来实现我们所需要的功能。

实现步骤

  1. 在Activity的onCreate()方法中获取整个布局的父容器,并注册触摸事件监听器。
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
        rootView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                // 处理触摸事件
                return false;
            }
        });
    }
}
  1. 在触摸事件监听器中解析MotionEvent对象的信息,实现所需功能。
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
        rootView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                int action = motionEvent.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        // 处理按下事件
                        break;
                    case MotionEvent.ACTION_MOVE:
                        // 处理滑动事件
                        break;
                    case MotionEvent.ACTION_UP:
                        // 处理松开事件
                        break;
                }
                return false;
            }
        });
    }
}

示例1:全局拦截滑动事件

有时候我们需要在整个Activity中拦截滑动事件,比如屏蔽上下滑动操作,只允许左右滑动。实现方法如下:

public class MainActivity extends AppCompatActivity {
    private float mLastX;
    private float mLastY;

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

        ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
        rootView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                int action = motionEvent.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        mLastX = motionEvent.getRawX();
                        mLastY = motionEvent.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        float x = motionEvent.getRawX();
                        float y = motionEvent.getRawY();
                        float diffX = x - mLastX;
                        float diffY = y - mLastY;
                        if (Math.abs(diffX) > Math.abs(diffY)) {
                            // 左右滑动
                            return true;
                        } else {
                            // 上下滑动
                            return false;
                        }
                    case MotionEvent.ACTION_UP:
                        break;
                }
                return false;
            }
        });
    }
}

在该示例中,我们记录了按下事件时的x、y坐标,在滑动事件中计算出x、y坐标的差值,并判断滑动方向,返回true表示将该事件拦截,false表示不拦截。

示例2:全局隐藏软键盘

当我们点击屏幕某个区域时,如果软键盘弹出了,需要点击两下才能将软键盘隐藏,这是很不方便的。因此我们可以通过对屏幕的触摸事件进行监听,在用户点击屏幕其他区域时自动隐藏软键盘。实现方法如下:

public class MainActivity extends AppCompatActivity {
    private InputMethodManager mImm;

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

        mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

        ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
        rootView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    View focusedView = getCurrentFocus();
                    if (isShouldHideInput(focusedView, motionEvent)) {
                        hideInputMethod(focusedView.getWindowToken());
                    }
                }
                return false;
            }
        });
    }

    private boolean isShouldHideInput(View focusedView, MotionEvent event) {
        if (focusedView != null && (focusedView instanceof EditText)) {
            int[] l = { 0, 0 };
            focusedView.getLocationInWindow(l);
            int left = l[0], top = l[1], bottom = top + focusedView.getHeight(), right = left + focusedView.getWidth();
            if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) {
                // 点击的区域在EditText内部,不需要隐藏软键盘
                return false;
            } else {
                return true;
            }
        }
        // 如果焦点不是EditText则忽略
        return false;
    }

    private void hideInputMethod(IBinder token) {
        if (token != null) {
            mImm.hideSoftInputFromWindow(token,
                    InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }
}

在该示例中,我们获取了系统的InputMethodManager对象,在触摸事件中判断是否需要隐藏软键盘并调用hideSoftInputFromWindow()方法进行隐藏。

以上就是实现Android全局触摸事件监听的完整攻略,希望能对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:手把手教你Android全局触摸事件监听 - Python技术站

(1)
上一篇 2023年6月13日
下一篇 2023年6月13日

相关文章

  • Python中max函数用法实例分析

    Python中max函数用法实例分析 在Python中,max()函数是一个非常常用的内置函数。它用于获取给定参数中的最大值。本文将详细讲解Python中max函数的用法,及其实例分析。 max函数的语法 max()函数的语法格式如下: max(iterable, *iterables[, key, default]) iterable: iterable是…

    python 2023年6月3日
    00
  • 13个最常用的Python深度学习库介绍

    13个最常用的Python深度学习库介绍 本文将介绍13个最常用的Python深度学习库,包括TensorFlow、PyTorch、Keras、CNTK、Theano、MXNet、Caffe、Chainer、Lasagne、PaddlePaddle、Gluon、Torch和DeepLearning4J。我们将介绍每个库的基本原理、特点和使用方法,并提供两个示…

    python 2023年5月14日
    00
  • 玩转python爬虫之正则表达式

    玩转Python爬虫之正则表达式 正则表达式是一种用于描述字符串模式的语言,可以用于匹配、查找、替换和割字符串。在Python爬虫中,正表达式是非重要的工具,可以用于从网中提取所需的信息。本文将详细讲解如何使用正则表达式进行Python爬,包括正则表达式语法re模块的常用函数以及两个常用的匹配实例。 正则表达式语法 正则表达式由一些特字符和普通字符组成,用于…

    python 2023年5月14日
    00
  • 2020年10款优秀的Python第三方库,看看有你中意的吗?

    2020年10款优秀的Python第三方库 Python是一门非常流行的编程语言,广泛应用于数据分析、机器学习、Web开发等领域。Python拥有非常丰富的第三方库,使得开发者可以快速构建复杂的应用程序。本文介绍了2020年10款优秀的Python第三方库,供开发者参考,其中有你中意的吗? 1. requests库 requests是一个Python第三方库…

    python 2023年5月13日
    00
  • python线程里哪种模块比较适合

    Python线程是一种轻量级的并发编程方式,可以在多个任务之间分享系统资源并提高程序的效率。在Python中,有多种模块可以用于线程编程,其中最常用的包括:threading、multiprocessing和concurrent.futures。这些模块都有自己特有的优点和适用场景,下面我们将具体探讨一下它们之间的区别以及如何选择哪种模块更适合。 线程模块讲…

    python 2023年5月19日
    00
  • Python中的进程分支fork和exec详解

    Python中的进程分支fork和exec详解 什么是进程分支 进程分支是操作系统中一种创建新进程的方式。通过进程分支可以创建一个与原有进程相同的新进程,从而让新进程执行一些和原有进程不一样的操作。在 Linux 等类 Unix 操作系统中,进程分支是通过 fork() 系统调用实现的。 fork系统调用 fork()系统调用可以创建一个新进程,这个新进程和…

    python 2023年6月2日
    00
  • python中bs4.BeautifulSoup的基本用法

    BeautifulSoup是一个Python库,用于解析HTML和XML文档,并提供了一些方便的方法来获取和操作文档中的元素。本文将详细讲解bs4.BeautifulSoup的基本用法,包括两个示例。 示例一:解析HTML文档 以下是一个示例代码,演示如何使用bs4.BeautifulSoup解析HTML文档: from bs4 import Beautif…

    python 2023年5月15日
    00
  • Python:从零开始开发多元线性回归模型

    【问题标题】:Python: Develope Multiple Linear Regression Model From ScrathPython:从零开始开发多元线性回归模型 【发布时间】:2023-04-03 13:45:01 【问题描述】: 我正在尝试在 python 中从头开始创建一个多元线性回归模型。使用的数据集:Boston Housing D…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部