Android多点触控手势基础

简介:

处理多点触控手势

多点触控就是同时把一根以上的手指放在屏幕上。

再继续往下以前需要补充一些名词:

  • 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的手指。
  • 触控事件:在触控手势中,有手指移动或者离开屏幕的时候就会引发一个触控事件。这个事件就存放在MotionEvent中。
    在这个事件中,包含说与的触控数据。
  • 触控:手指碰到屏幕的时候就产生了一个触控(pointer)。

追踪多个触控点

多个手指同时放在屏幕上的时候会触发以下的系统事件:

  • ACTION_DOWN --第一个对屏幕的触碰。这是多点触控的开始。这个触碰的而数据
    保存在index为0的MotionEvent中。
  • ACTION_POINTER_DOWN--其他对屏幕的触碰。触碰事件的index可以用方法getActionIndex()获取到。
    触碰的数据保存在这个index指定的MotionEvent中。
  • ACTION_MOVE--放在屏幕上的任何一根手指移动的时候触发。
  • ACTION_POINTER_UP--第一个触摸屏幕的手指以外的其他手指离开屏幕的时候触发。
  • ACTION_UP--当最后一根手指离开屏幕的时候触发。

你可以通过触碰事件的index或者ID来获得事件MotionEvent

  • Index: 一个MotionEvent存储了几根手指触摸屏幕的每一个手指的触碰数据。一般处理触摸
    的是后都用index作为获取MotionEvent的依据,而不是触碰ID。
  • ID:整个多点触摸事件过程中,每一个触摸都有一个ID和整个触摸匹配。

一个触碰的index在MotionEvent中可能发生改变的。而整个触碰的ID是保持不变的,只要整个
触碰保持激活状态。用getPointerId()可以获取整个手势执行期间的每一个event里的触碰数据。
也可以通过findPointerIndex()来根据一个触控的ID来获取这触控在触控事件中的index。比如:

var mActivePointerId: Int? = null

override fun onTouchEvent(event: MotionEvent?): Boolean {
    mActivePointerId = event?.getPointerId(0)
    
    // 其他的事件先不管...

    // 用触控ID获得index,然后获取位置数据
    var pointerIndex = event?.findPointerIndex(mActivePointerId!!)

    // 获取触控的当前位置
    var x = event?.getX(pointerIndex!!)
    var y = event?.getY(pointerIndex!!)

    return true
}

获取一个MotionEvent的Action

你应该使用getActionMasked()(或者从兼容方面考虑的话用MotionEventCompat.getAtionMasked()来获取
MotionEvent的action。与getAction()不同,getActionMasked()就是被用来处理多点触控的。
这个方法的返回值不在包含触控index的位数。你可以用getActonIndex()来获取触控action的index。这些在后面详细叙述。

注意:后面的例子用的是MotionEventCompat类。这个类在Support Library中。
你可以使用MotionEventCompat来获得更多的平台支持。MotionEventCompat不是用来代替MotionEvent的。
其实,这个类只是提供了一些静态方法以方便使用。
override fun onTouchEvent(event: MotionEvent?): Boolean {
    var action = MotionEventCompat.getActionMasked(event!!)

    var index: Int = MotionEventCompat.getActionIndex(event!!)
    var xPos = -1.0f
    var yPos = -1.0f

    Log.d(TAG, "The action is " + actionToSring(action))

    if (event!!.pointerCount > 1) {
        Log.d(TAG, "Mutipletouch event")

        // 坐标系是相对于处理这个事件的View或者Activity的
        xPos = MotionEventCompat.getX(event!!, index)
        yPos = MotionEventCompat.getY(event!!, index)
    } else {
        //单点触控
        Log.d(TAG, "Single touch event")
        xPos = MotionEventCompat.getX(event!!, index)
        yPos = MotionEventCompat.getY(event!!, index)
    }

    return true
}

fun actionToSring(action: Int): String {
    when (action) {
        MotionEvent.ACTION_DOWN -> return "Down"
        MotionEvent.ACTION_MOVE -> return "Move"
        MotionEvent.ACTION_POINTER_DOWN -> return "Pointer down"
        MotionEvent.ACTION_UP -> return "UP"
        MotionEvent.ACTION_POINTER_UP -> return "Pointer up"
        MotionEvent.ACTION_OUTSIDE -> return "Outside"
        MotionEvent.ACTION_CANCEL -> return "Cancel"
    }
    return ""
}

原文是Google的文档。但是文档杜宇前提和一些概念的描述不足,会导致初学者理解出现偏差。我都加上了,我就是初学者。

代码都是用Kotlin写的,自从用了这个语言就再也不想用Java了。对于Java开发者理解Kotlin的代码没有什么太大的问题,基本上都一样。

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!














本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/5245293.html ,如需转载请自行联系原作者
相关文章
|
4月前
|
XML Java Android开发
Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
36 0
|
搜索推荐 Java Linux
Android基础入门教程
Android是一种基于Linux的自由及开放源代码的操作系统,Android 分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。
204 0
|
XML 存储 移动开发
Android基础 | 关于Activity你应该明白的一切
Activity 作为一个老生常谈的话题,它是我们刚接触Android开发就遇到,虽然已有一段时间开发经验,但谈起完全搞懂Activity相关,不敢妄言,故结合个人理解及书籍参考,简单总结一下 Activity基础相关知识,其中也留出了一些有意思的问题。
142 0
|
XML 存储 安全
Android四大组件全面解析,夯实基础。(下)
Android四大组件 lay a solid foundation 夯实基础
167 0
|
Android开发
Android四大组件全面解析,夯实基础。(中)
Android四大组件 lay a solid foundation 夯实基础
180 0
Android四大组件全面解析,夯实基础。(中)
|
存储 设计模式 前端开发
Android四大组件全面解析,夯实基础。(上)
Android四大组件 lay a solid foundation 夯实基础
108 0
|
安全 Java 调度
Android多线程编程——线程基础
Android沿用了Java的线程模型,一个Android应用在创建的时候会开启一个线程,我们叫它主线程或者UI线程。
208 0
Android多线程编程——线程基础
|
Java Android开发
移动应用程序设计基础——Android环境构建与Activity生命周期
安装智能手机开发相关软件平台,并在此基础上测试Activity的生命周期过程。 5、 完成智能手机开发平台安装、以及相关配置; 6、 并实现Hello World; 7、 添加Log日志,通过Log日志验证Ac 1、 安装JAVA JDK 2、 安装Android Studio,熟悉AS的基本操作,改变AS的字体,显示方式;截图和文字说明。 3、 建立新项目,实现Hello World。说明各个文件的作用,以及各个关键语句的作用或含义,给出程序的运行结果。 4、 设置生命周期的Log日志,分别执行相关操作
233 0
移动应用程序设计基础——Android环境构建与Activity生命周期
|
XML 存储 Java
Android动画基础详析 | 概述、逐帧动画、视图动画(附诸多实际运行效果动图)
Android动画基础详析 | 概述、逐帧动画、视图动画(附诸多实际运行效果动图)
|
API Android开发
Android动画基础详析 | 属性动画基础及ValueAnimator
Android动画基础详析 | 属性动画基础及ValueAnimator