• 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的代码没有什么太大的问题,基本上都一样。

  • 相关阅读:
    《构建之法》
    《构建之法》第一单元
    查询特殊字符
    Excel文件批量导入SQLSERVER数据库中(利用Foreach容器)
    当月的最后一天SELECT DATEADD(dd,1,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) 20140930 00:00:00.000
    the difference between primary key and unique key
    sql中如何再判断一个字段是否为空,如果不为空然后再Select这个字段,这要如何写呢?
    union和union all的区别
    UIImageView的基本使用
    UINavigationController导航控制器
  • 原文地址:https://www.cnblogs.com/sunshine-anycall/p/5245293.html
Copyright © 2020-2023  润新知