【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )

简介: 【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )

文章目录

I . 多点触控事件

II . PointerId 与 PointerIndex 简介

III . 本次 PointerId 与 PointerIndex 获取

IV . PointerId 与 PointerIndex 互相转化

V . 触摸点个数获取 ( getPointerCount )

VI . 触摸点坐标获取

VII . 多点触控 示例代码 ( 参考 )



I . 多点触控事件


1 . 多点触控事件 :



① ACTION_DOWN : 第一个手指按下


② ACTION_MOVE : 所有的手指移动


③ ACTION_UP : 最后一个手指抬起


④ ACTION_POINTER_DOWN : 中间的手指按下 ( 已经有手指按下 )


⑤ ACTION_POINTER_UP : 中间手指抬起 ( 还有手指在触摸中 )



2 . 获取多点触控事件 : 调用 MotionEvent 对象的 getActionMasked() 可以获取多点触控事件 , 即上面的 5 种触摸事件 ;



3 . 获取并处理多点触控事件代码示例 :



① 获取多点触控事件 :


//获取当前的多点触控触摸事件
int actionMasked = event.getActionMasked();


② 处理多点触控事件 :


//处理 5种多点触控事件
switch (actionMasked){
    case MotionEvent.ACTION_DOWN :          //第一个手指按下
        break;
    case MotionEvent.ACTION_MOVE :          //手指移动
        break;
    case MotionEvent.ACTION_UP :            //最后一个手指抬起
        break;
    case MotionEvent.ACTION_POINTER_DOWN :  //中间的手指按下 ( 已经有手指按下 )
        break;
    case MotionEvent.ACTION_POINTER_UP :    //中间手指抬起 ( 还有手指在触摸中 )
        break;
}




II . PointerId 与 PointerIndex 简介


1 . Pointer 触摸点 :



① PointerId : 触摸点标识 , 一旦赋值不可更改 ;


手指按下 , 该触摸点产生 自带触摸点 ID 属性 , 以及分配一个触摸点索引 , 当手指抬起 , 该触摸点 ID 值回收 ; 期间触摸点 ID 不会改变 ;


② PointerIndex : 触摸点索引 , 触摸点的索引值可能会变 ;


该值从 0 开始计数 , 取值范围是 0 ~ 触摸点个数 - 1 , 每当有一个中间触摸点抬起 , 后面的触摸点就会依次替补该空缺 ;



2 . MotionEvent 与 Pointer 触摸点关系 :


MotionEvent 对象中存储多个触摸点信息 , 每个触摸点都有 PointerId ( 触摸点标识 ) 和 PointerIndex ( 触摸点索引 ) 两个属性 ;



3 . PointerId 与 PointerIndex 运行机制 :


PointerId 触摸点 ID 标识 , 只要按下 , 不抬起 , 值不变 , 如果中间手指抬起 , 那么出现中间的 ID 空置的情况 ; 3 个手指按下 , PointerId 分别是 0, 1 , 2 ;中间的抬起 , 那么 PointerId 的 ID 值会空着 , 两个手指的 ID 分别是 0 和 2 ;


PointerIndex 触摸点索引值 , 3 个手指按下 , 索引值依次是 0 , 1 , 2 , 如果第二个手指抬起 , 后续的第三个的索引会由 2 变成 1 , 顺序补位替补上去 ;




III . 本次 PointerId 与 PointerIndex 获取


① 获取本次的触摸事件的 触摸点 ID :

//获取本事件对应的 pointerIndex
int actionIndex = event.getActionIndex();



② 获取本次触摸事件的 触摸点 索引 :


//4 . 获取 actionIndex 对应的 PointerId
int pointerId = event.getPointerId(actionIndex);




IV . PointerId 与 PointerIndex 互相转化


PointerId 与 PointerIndex 关联 及 转化关系 :



① 两者特点 : PointerId 是固定不变的 , PointerIndex 有顺序补位的特征 , 是不确定的 ;


② PointerId -> PointerIndex : 通过调用 MotionEvent 对象的 findPointerIndex(int pointerId) 方法可以获取指定 pointerId 对应的 PointerIndex 值 ;


③ PointerIndex -> PointerId : 通过调用 MotionEvent 对象的 getPointerId(int pointerIndex) 方法可以获取指定 PointerIndex 对应的 pointerId 值 ;



//3 . 获取 PointerId 对应的 PointerIndex

//      查找 ID值 对应的索引值
int pointerIndex = event.findPointerIndex(PointerId);
...
//  获取 索引值 对应的 ID 值
int PointerId = event.getPointerId(PointerIndex)




V . 触摸点个数获取 ( getPointerCount )


获取当前触摸点个数 :


//获取当前触摸点个数
int pointCount = event.getPointerCount();




VI . 触摸点坐标获取


获取触摸点坐标 :



① 获取当前触摸事件坐标 :


public final float getX()

public final float getY()



② 获取指定触摸点索引 PointerIndex 坐标 : ( 注意不是触摸点标识 )


public final float getX(int pointerIndex)

public final float getY(int pointerIndex)


//1 . 获取 坐标


//1.1 获取 当前 触摸 事件的 x y 坐标
float x = event.getX();
float y = event.getY();
//1.2 获取 指定 pointerIndex 的 x y 坐标 ( 获取第 0 个索引的坐标 )
int pointerIndex = 0;
float x_pointer = event.getX(pointerIndex);
float y_pointer = event.getY(pointerIndex);



VII . 多点触控 示例代码 ( 参考 )


package kim.hsl.multitouch;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //多点触控示例
        /*
            1 . 多点触控事件 :
                多点触控事件 Action 由 pointerIndex 和 动作码 进行或运算 合成
                调用 event.getActionMasked() 即可获取动作码 , 屏蔽 pointerIndex 触摸索引
            2 . PointerId 和 PointerIndex :
                Pointer 就是触摸点 ;
                两个值的特点 :
                    PointerId : 唯一性的表示一个触摸点 , 该值如果触摸上 , 任意移动 , 只要不抬起 , 就不变 ;
                    PointerIndex : 触摸点的索引 , 是一个从 0 开始计数的连续的数值 , 同样是第 0 个索引 , 代表的可能是不同触摸点 ;
                运行机制 :
                    PointerId : 只要按下 , 不抬起 , 值不变 , 如果中间手指抬起 , 那么出现中空的情况 ;
                                3 个手指按下 , PointerId 分别是 1 , 2 , 3 ;
                                    中间的抬起 , 那么 PointerId 的 ID 值会空着 , 两个手指的 ID 分别是 1 和 3
                    PointerIndex : 3 个手指按下 , 如果第二个手指抬起 , 后续的第三个的索引会由 2 变成 1 , 顺序补位替补上去
                 PointerId 与 PointerIndex 转换换 :
                    pointerId 是确定的 , PointerIndex 有顺序补位的特征 , 是不确定的
                    通过 findPointerIndex(int pointerId) 方法可以获取指定 pointerId 的 PointerIndex 值
             3 . 获取坐标 :
                 获取当前坐标 : event.getX();
                 获取指定 pointerIndex 坐标 : event.getX(pointerIndex);
             4 . 多点触控的 5 种事件 :
                单点触控需要处理 ACTION_DOWN , ACTION_MOVE , ACTION_UP
                多点触控需要处理 ACTION_DOWN , ACTION_MOVE , ACTION_UP , ACTION_POINTER_DOWN , ACTION_POINTER_UP
                多点触控中这些动作有不同的含义 :
                    ACTION_DOWN : 第一个手指按下
                    ACTION_MOVE : 所有的手指滑动事件
                    ACTION_UP : 最后一个手指抬起
                    ACTION_POINTER_DOWN : 中间的手指按下 ( 已经有手指按下 )
                    ACTION_POINTER_UP : 中间手指抬起 ( 还有手指在触摸中 )
               5 . 多点触控与单点触控对比
                    多了两个事件 ACTION_POINTER_DOWN 和 ACTION_POINTER_UP
                    多了触摸点 ID 标识与触摸点索引机制
         */
        //1 . 获取 坐标
        //1.1 获取 当前 触摸 事件的 x y 坐标
        float x = event.getX();
        float y = event.getY();
        //1.2 获取 指定 pointerIndex 的 x y 坐标 ( 获取第 0 个索引的坐标 )
        int pointerIndex = 0;
        float x_pointer = event.getX(pointerIndex);
        float y_pointer = event.getY(pointerIndex);
        //2 . 获取 触摸事件 相关属性
        //获取当前的多点触控触摸事件
        int actionMasked = event.getActionMasked();
        //获取本事件对应的 pointerIndex
        int actionIndex = event.getActionIndex();
        //获取当前触摸点个数
        int pointCount = event.getPointerCount();
        //3 . 获取 PointerId 对应的 PointerIndex
        //      查找第 1 个按下的手指的索引值
        pointerIndex = event.findPointerIndex(0);
        //4 . 处理对应的事件操作
        switch (actionMasked){
            case MotionEvent.ACTION_DOWN :          //第一个手指按下
                Log.i("TAG", "ACTION_DOWN : 第一个手指按下");
                break;
            case MotionEvent.ACTION_MOVE :          //手指移动
                Log.i("TAG", "ACTION_MOVE : 手指移动");
                break;
            case MotionEvent.ACTION_UP :            //最后一个手指抬起
                Log.i("TAG", "ACTION_UP : 最后一个手指抬起");
                break;
            case MotionEvent.ACTION_POINTER_DOWN :  //中间的手指按下 ( 已经有手指按下 )
                Log.i("TAG", "ACTION_POINTER_DOWN : 中间的手指按下 ( 已经有手指按下 )");
                break;
            case MotionEvent.ACTION_POINTER_UP :    //中间手指抬起 ( 还有手指在触摸中 )
                Log.i("TAG", "ACTION_POINTER_UP : 中间手指抬起 ( 还有手指在触摸中 )");
                break;
        }
        return true;
    }
}




目录
相关文章
|
28天前
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
1月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
18天前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
1月前
|
缓存 监控 前端开发
探索Android应用开发之旅:从新手到专家
【10月更文挑战第42天】本文将带你踏上Android应用开发的旅程,无论你是初学者还是有经验的开发者。我们将一起探索如何从零开始创建你的第一个Android应用,并逐步深入到更高级的主题,如自定义视图、网络编程和性能优化。通过实际示例和清晰的解释,你将学会如何构建高效、吸引人的Android应用。让我们一起开启这段激动人心的旅程吧!
|
1月前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。
|
1月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
1月前
|
传感器 XML IDE
探索安卓应用开发:从基础到进阶
【10月更文挑战第23天】在数字化时代的浪潮中,移动应用已成为人们日常生活的延伸。本文以安卓平台为例,深入浅出地介绍了如何从零开始构建一个安卓应用,涵盖了开发环境搭建、基本组件使用、界面设计原则以及进阶技巧等关键步骤。通过实例演示和代码片段,引导读者逐步掌握安卓应用开发的核心技能,旨在激发更多开发者对安卓平台的探索热情,并为初学者提供一条清晰的学习路径。
|
1月前
|
Android开发 Swift iOS开发
探索iOS与安卓应用开发的差异性
探索iOS与安卓应用开发的差异性
49 2
|
1月前
|
前端开发 Android开发 UED
安卓应用开发中的自定义控件实践
【10月更文挑战第35天】在移动应用开发中,自定义控件是提升用户体验、增强界面表现力的重要手段。本文将通过一个安卓自定义控件的创建过程,展示如何从零开始构建一个具有交互功能的自定义视图。我们将探索关键概念和步骤,包括继承View类、处理测量与布局、绘制以及事件处理。最终,我们将实现一个简单的圆形进度条,并分析其性能优化。
|
1月前
|
开发工具 Android开发 Swift
探索iOS与安卓应用开发的异同点
【10月更文挑战第24天】本文通过比较iOS和安卓开发环境,旨在揭示两大移动平台在开发过程中的相似性与差异性。我们将探讨开发工具、编程语言、用户界面设计、性能优化及市场分布等方面,以期为开发者提供全面的视角。通过深入浅出的分析,文章将帮助读者更好地理解每个平台的独特之处及其对应用开发的影响。