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

手把手教你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 xlrd/xlwt 创建excel文件及常用操作

    下面就为您讲解“Pythonxlrd/xlwt创建excel文件及常用操作”的完整实例教程。 1. 准备工作 在使用pythonxlrd/xlwt库之前,需要先安装这两个库。可以使用pip命令进行安装。 pip install xlrd xlwt 2. 创建Excel文件 要创建一个Excel文件,首先需要使用xlwt库创建一个Workbook对象,然后在该…

    python 2023年5月13日
    00
  • Python函数式编程指南(一):函数式编程概述

    Python函数式编程指南(一):函数式编程概述 什么是函数式编程 函数式编程是一种编程范式,其中的计算过程依赖于函数的处理过程,而不是依赖于改变变量的值来保存中间结果。在函数式编程中,函数被视为是“第一公民”,因为它们可以作为另一个函数的参数,也可以被作为返回值返回。 函数式编程的优势 函数式编程的优点之一是可以更容易地推断函数的行为。因为函数在功能上的定…

    python 2023年5月31日
    00
  • python获取响应某个字段值的3种实现方法

    Python获取响应某个字段值的3种实现方法 在Python中,我们经常需要从HTTP响应中获取某个字段的值。本文将介绍三种Python获取响应某个字段值的实现方法,并提供两个示例代码。 方法1:使用json库解析JSON响应 如果HTTP响应是JSON格式的,我们可以使用json库解析响应,并获取某个字段的值。以下是示例代码的步骤: 导入必要的库 impo…

    python 2023年5月15日
    00
  • Python基础之内置模块详解

    Python基础之内置模块详解 什么是Python内置模块? Python内置模块是指包含在Python语言中,并且可以直接使用而无需安装的模块。 Python内置模块主要包括以下几个方面: 数据类型模块 数学运算模块 时间日期模块 文件操作模块 网络通信模块 在我们的编程实践中,掌握Python内置模块的方法和使用技巧是非常重要的。 Python内置模块示…

    python 2023年6月5日
    00
  • 使用Python的Django框架中的压缩组件Django Compressor

    使用Python的Django框架中的压缩组件Django Compressor可以帮助Web开发者将静态资源如JavaScript、CSS等进行压缩和组合,减少页面加载时间,提高页面性能。 以下是使用Django Compressor的完整攻略: 安装Django Compressor 在终端中执行以下命令安装Django Compressor: pip …

    python 2023年6月13日
    00
  • Python:扁平化包含来自函数的另一个元组的元组的最简单方法

    【问题标题】:Python: easiest way to flatten a tupple containing another tupple from a functionPython:扁平化包含来自函数的另一个元组的元组的最简单方法 【发布时间】:2023-04-01 17:17:01 【问题描述】: 我的代码是这样的: def f1(): retur…

    Python开发 2023年4月8日
    00
  • Python实现动态循环输出文字功能

    下面是关于“Python实现动态循环输出文字功能”的攻略: 环境准备 在开始实现动态循环输出文字功能之前,我们需要先搭建好Python开发环境。具体的搭建步骤这里不再赘述,你可以通过搜索引擎找到相关的教程进行学习。 在环境搭建好之后,我们要安装一个Python的第三方库 blessed,用于在命令行中控制输出样式。可以通过在命令行中使用 pip 工具安装: …

    python 2023年6月3日
    00
  • Python编程编写完善的命令行工具

    监考官,下面是Python编程编写完善的命令行工具的完整攻略: 1. .bashrc文件配置 在使用命令行工具之前,需要对.bashrc文件进行配置,使得当前的命令行工具能够被正确调用。可以在.bashrc文件中添加以下内容: export PATH=$PATH:/path/to/your/tool 其中/path/to/your/tool指代你自己命令行工…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部