安卓触摸事件概述

1、触摸分类

(1)单点触摸

  • 单点触控,只能识别和支持每次一个手指的触控、点击,若同时有两个以上的点被触碰,就不能做出正确反应。很多医院、图书馆等的大厅都有这种触控技术的电脑,支持触摸屏的手机、MP3、数码相机也多采用这种单点触控技术。

(2)多点触摸

  • 多点触控(又称多重触控、多点感应、多重感应,英文Multitouch或Multi-Touch)是采用人机交互技术与硬件设备共同实现的技术,能在没有传统输入设备(如鼠标、键盘等)。下进行计算机的人机交互操作。多点触摸技术,能构成一个触摸屏(屏幕,桌面,墙壁等)或触控板,都能够同时接受来自屏幕上多个点进行计算机的人机交互操作。

2、触摸动作

动作 常量
按下 MotionEvent.ACTION_DOWN
移动 MotionEvent.ACTION_MOVE
放开 MotionEvent.ACTION_UP

3、触摸监听器

  • 触摸监听器 - onTouchListener - 接口

4、触摸方法

  • 在onTouch()抽象 方法里,我们可以根据不同动作编写不同事件处理代码。

5、触点个数与坐标

  • 通过MotionEvent对象的getX()和getY()方法可以获得触摸点的坐标。如果是多点触摸,通过getPointerCount()获取触点个数,然后通过getX(pointerIndex)与getY(pointerIndex)获得某个触点的坐标。

6、安卓触摸事件处理机制

  • 触摸事件从view树的根节点开始一直传递到最下层,直到某个onTouchEvent()接收处理此事件。每个部分对触摸事件的处理过程如下:
  • Activity的处理过程: Activity.dispatchTouchEvent()最先被调用,其作用是调用RootView(通常是一个ViewGroup)的dispatchTouchEvent(),即负责分发事件。ViewGroup中的dispatch会调用其他孩子的dispatchTouchEvent()。注意:Activity中的onTouchEvent()是整个View的触摸事件传递链条的终点,不过前提是整个过程中没有view的touchEvent对此事件感兴趣。
  • View的处理过程: 检查是否有TouchListener()注册在这个View中,如果有则查看其是否想要消费此次事件,如果不消费事件,那么接下来该View的onTouchEvent()就要被调用了,如果未返回true,事件就会返回视图树的上一层。
  • ViewGroup的处理过程: 根据触摸发生的位置来判断哪些孩子可能会触发触摸事件,如果有重叠部分则按照被加入到ViewGroup中顺序的逆序来依次处理。ViewGroup可以引发一个中断(onInterceptTouchEvent())来强制把事件交给自己处理,当子视图的事件被剥夺时,子视图会收到ACTION_CANCEL事件,子视图可以用requestDisallowTouchIntercept()方法来屏蔽这个事件。
  • 由此可见,Touch事件是层层向下传递的,如果某个视图接收了此事件则接下来的视图就无法再次接收,但ViewGroup可以强制从子视图手中剥夺一个触摸事件。

(一)案例演示:通过单点触摸移动米老鼠

1、创建安卓应用

-这里我们 还是使用基于Empty Activity模板创建安卓应用 - MoveMickeyByTouch

  • 点击Finish

2、准备图片素材

  • 将背景图片与米老鼠图片,拷贝到drawable目录里

3、字符串资源文件

  • 字符串资源文件 -strings.xml
<resources><string name="app_name">通过触摸移动米老鼠</string>
</resources>

4、主布局资源文件

  • 找到主布局资源文件 - activity_main.xml
  • 这里需要将约束布局改成线性布局,再添加一个图像控件显示米老鼠
- <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/root"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:gravity="center"tools:context=".MainActivity"><ImageViewandroid:id="@+id/iv_mickey"android:layout_width="100dp"android:layout_height="120dp"android:scaleType="fitXY"android:src="@drawable/mickey"/></LinearLayout>
  • 查看预览效果

5、主界面类实现功能

  • 主界面类 - MainActivity

  • 声明变量和常量

  • 通过资源标识符获取控件实例

  • 让根部局获取焦点

  • 给线性根部局注册触摸监听器

  • 完整源代码

package net.lh.move_mickey_by_tocuh;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;public class MainActivity extends AppCompatActivity {private LinearLayout root; //线性根部局private ImageView ivMickey; // 米老鼠图像控件private static final String TAG = "move_mickey_by_touch"; // 标记常量@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局资源文件设置用户界面setContentView(R.layout.activity_main);// 通过资源标识符获取控件实例root=findViewById(R.id.root);ivMickey=findViewById(R.id.iv_mickey);//让根布局获取焦点root.setFocusable(true);root.requestFocus();//给线性布局注册触摸监听器,实现触摸监听器接口,编写触摸事件代码root.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {//根据不同的触摸动作执行不同操作switch (event.getAction()) {case MotionEvent.ACTION_DOWN://0,触点按下//调试信息输出触点坐标Log.d(TAG, "ACTION_DOWN(" + event.getX() + "," + event.getY() + ")");break;case MotionEvent.ACTION_MOVE://2,触点移动//调试信息输出触点坐标Log.d(TAG, "ACTION_MOVE(" + event.getX() + "," + event.getY() + ")");break;case MotionEvent.ACTION_UP://1,触点放开//调试信息输出触点坐标Log.d(TAG, "ACTION_UP(" + event.getX() + "," + event.getY() + ")");break;}//根据变化的触点坐标来更新米老鼠图像控件的布局参数ivMickey.setX(event.getX() - ivMickey.getWidth() / 2);ivMickey.setY(event.getY() - ivMickey.getHeight() / 2);return true;//设置为true,三个事件:down-->move-->up才会依次执行}});}
}

6、启动应用,查看效果

  • 启动后,米老鼠在屏幕左上角

7、修改主界面类

  • 原有代码中,移动鼠标,确实可以让米老鼠跟着动起来,但是有一个体验不好,触点是米老鼠的左上角,为了能让触点是在米老鼠的中央,我直接使用更改过后的代码呈现给大家。
  • 这里我们不采用图像控件的布局参数,直接调用图像控件的setX()和setY()方法,分别传入触点横坐标event.getX()和纵坐标event.getY(),如果希望触点在米老鼠控件中央,那么分别传入event.getX() - ivMickey.getWidth() / 2与==event.getY() ==- ivMickey.getHeight() / 2

8、重启应用,查看效果

  • 移动米老鼠,可以看到触点在米老鼠中央

(二)案例演示:通过多点触摸移动米老鼠

1、创建安卓应用

  • 基于Empty Activity模板创建安卓应用 - MoveMickeyByTouch
  • 点击Finish

2、准备图片素材

  • 将背景图片与米老鼠图片,拷贝到drawable目录里

3、字符串资源文件

  • 字符串资源文件 -strings.xml
<resources><string name="app_name">通过多点触摸缩放米老鼠</string>
</resources>

4、主布局资源文件

  • 主布局资源文件 - activity_main.xml
  • 将约束布局改成线性布局,再添加一个图像控件显示米老鼠
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/root"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:orientation="vertical"tools:context=".MainActivity"><ImageViewandroid:id="@+id/iv_mickey"android:layout_width="100dp"android:layout_height="120dp"android:scaleType="fitXY"android:src="@drawable/mickey" /></LinearLayout>
  • 查看预览效果

5、主界面类实现功能

  • 主界面类 - MainActivity
  • 声明变量
  • 通过资源标识符获取控件实例
  • 让根部局获取焦点
  • 给根布局注册触摸监听器
package net.lh.move_mickey_by_tocuh;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;public class MainActivity extends AppCompatActivity {private LinearLayout root; // 线性根布局private ImageView ivMickey; // 米老鼠图像控件private float x1, y1; // 第一个触点的坐标private float x2, y2; // 第二个触点的坐标private float nextX1, nextY1; // 第一个触点下一次的坐标private float nextX2, nextY2; // 第二个触点下一次的坐标private float distance; // 两个触点之间的距离private float nextDistance; // 两个触点之间下一次的距离private LinearLayout.LayoutParams layoutParams; // 布局参数@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局资源文件设置用户界面setContentView(R.layout.activity_main);// 通过资源标识符获取控件实例root = findViewById(R.id.root);ivMickey = findViewById(R.id.iv_mickey);// 让根布局获取焦点root.setFocusable(true);root.requestFocus();// 获取米老鼠图像控件的布局参数layoutParams = (LinearLayout.LayoutParams) ivMickey.getLayoutParams();// 给根布局注册触摸监听器,实现触摸监听器接口,编写触摸事件方法root.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// 判断触点个数if (event.getPointerCount() == 1) { // 单点触摸 - 移动米老鼠if (event.getAction() == MotionEvent.ACTION_MOVE) {// 根据变化的触点坐标来更新米老鼠图像控件的布局参数layoutParams.leftMargin = (int) (event.getX() - ivMickey.getWidth() / 2);layoutParams.topMargin = (int) (event.getY() - ivMickey.getHeight() / 2);}} else if (event.getPointerCount() == 2) { // 两点触摸 - 缩放米老鼠// 判断触点动作switch (event.getAction()) {case MotionEvent.ACTION_DOWN: // 触点按下// 获取第一个触点的坐标x1 = event.getX(0);y1 = event.getY(0);// 获取第二个触点的坐标x2 = event.getX(1);y2 = event.getY(1);// 计算两个触点之间的距离distance = (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));break;case MotionEvent.ACTION_MOVE: // 触点移动// 获取第一个触点下一次的坐标nextX1 = event.getX(0);nextY1 = event.getY(0);// 获取第二个触点下一次的坐标nextX2 = event.getX(1);nextY2 = event.getY(1);// 计算两个触点之间下一次的距离nextDistance = (float) Math.sqrt((nextX1 - nextX2) * (nextX1 - nextX2) + (nextY1 - nextY2) * (nextY1 - nextY2));break;case MotionEvent.ACTION_UP: // 触点放开break;}// 修改米老鼠图像控件的布局参数if (nextDistance > distance) { // 放大图片if (layoutParams.width < 1500) { // 控制最大尺寸layoutParams.width = (int) (layoutParams.width * 1.05);layoutParams.height = (int) (layoutParams.height * 1.05);}} else { // 缩小图片if (layoutParams.width > 10) { // 控制最小尺寸layoutParams.width = (int) (layoutParams.width / 1.05);layoutParams.height = (int) (layoutParams.height / 1.05);}}// 第一个触点坐标进行迭代x1 = nextX1;y1 = nextY1;// 第二个触点坐标进行迭代x2 = nextX2;y2 = nextY2;// 重新计算两个触点之间的距离distance = (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}// 重新设置米老鼠图像控件的布局参数ivMickey.setLayoutParams(layoutParams);return true;}});}
}

6、运行程序,查看结果

  • 既可以移动米老鼠,也可以缩放米老鼠(按住Ctrl键+鼠标左键拖动)

安卓触摸方法如何使用?相关推荐

  1. 安卓学习笔记13:安卓触摸事件

    文章目录 零.学习目标 一.安卓触摸事件概述 1.触摸分类 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 二.安卓单点触摸 三.教学案例--通过单点触摸移动米老鼠 (一)运行效果 ( ...

  2. Android Studio笔记4.2 安卓触摸事件

    文章目录 一.前言 二.笔记4.2 安卓触摸事件 (一)安卓触摸事件概述 1.触摸分类 (1).单点触摸 (2).多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸 ...

  3. 3.2 安卓触摸事件

    文章目录 一.安卓触摸事件概述 1.触摸分类 (1)单点触摸 (2)多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸事件处理机制 二.案例演示:通过单点触摸移动米 ...

  4. 安卓讲课笔记4.2 安卓触摸事件

    文章目录 零.学习目标 一.导入新课 二.新课讲解 (一)安卓触摸事件概述 1.触摸分类 (1)单点触摸 (2)多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸事 ...

  5. Android基础学习笔记13:安卓触摸事件触摸按键

    学习目标 了解安卓触摸动作 熟悉触摸监听器与方法 掌握单点触摸与多点触摸 在Android系统中,触摸是用户最常用,最基础的交互方式,只有弄通触摸事件在系统中的传递处理机制才能更好地增强用户的交互体验 ...

  6. Android Studio 笔记4.2 安卓触摸事件

    文章目录 一.前言 二.笔记4.2 安卓触摸事件 (一)安卓触摸事件概述 1.触摸分类 (1).单点触摸 (2).多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸 ...

  7. Android Studio学习:安卓触摸事件

    (一)安卓触摸事件概述 1.触摸分类 (1)单点触摸 单点触控,只能识别和支持每次一个手指的触控.点击,若同时有两个以上的点被触碰,就不能做出正确反应.很多医院.图书馆等的大厅都有这种触控技术的电脑, ...

  8. 4.2 安卓触摸事件

    文章目录 一.简介 二.概述 (一)安卓触摸事件概述 1.触摸分类 (1)单点触摸 (2)多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸事件处理机制 (二)案例 ...

  9. 4.3 安卓触摸事件

    文章目录 一.安卓触摸事件概述 1.触摸分类 (1)单点触摸 (2)多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸事件处理机制 二.案例演示:通过单点触摸移动米 ...

最新文章

  1. 数据库-ADONET-使用强类型DataSet
  2. boost::regex模块实现吐出链接的 URL的测试程序
  3. bzoj 2142 礼物
  4. Java关键字final使用详解
  5. 对象创建过程之二(类加载器)
  6. c 语言输出后不关闭_穿书+娱乐圈 |再不跑路就要被迫C位出道了花瓶女配和影帝组CP后豪门娇美人是爽文剧本...
  7. 基础编程题目集 6-3 简单求和 (10 分)
  8. XP硬盘分区软件测试面试,怎样让WinXP系统自检并修复硬盘?
  9. 【声辐射】——不同坐标系下的格林函数
  10. 斯坦福李飞飞CS231n笔记1计算机视觉概述与历史背景
  11. hadoop 关闭datanode节点时发生异常:no datanode to stop
  12. 好公司和差公司的对比
  13. u-blox gps 串口驱动安装恢复解决方案
  14. vmplayer linux kernel headers
  15. WinForms时代结束,报表控件FastReport.NET开启FastReport.Core.Skia 时代!
  16. 工作计划表怎么做?30份Excel工作计划表模板,职场人必备,可套用
  17. Cython简单demo
  18. vs2017无法打开文件atls.lib问题
  19. 计算机应用基础165791,[2018年最新整理]人大网大计算机应用基础试题答案.doc
  20. 内部环境--SWOT分析法

热门文章

  1. 《二代征信》与你的生活息息相关(3)
  2. Hulk(cf705A)(水)
  3. 梯度下降求解一元二次函数
  4. 利用计算机技术执行去自动化,分析办公自动化中的计算机技术应用
  5. WanJetpack项目:用Jetpack实现玩Android,追求最官方的实现方式
  6. Dell安装驱动程序出现的错误(DupAPI::Execute): *** Shell Execute Error. System error text
  7. 全美房租最贵TOP20多半都在曼哈顿 月租$3790起
  8. 【R语言可视化】-- 柱状图要点一网打尽
  9. offset和style的区别
  10. 宏基笔记本预装软件中英文对照表