本文共 3003 字,大约阅读时间需要 10 分钟。
多点触控就是同时把一根以上的手指放在屏幕上。
再继续往下以前需要补充一些名词:
MotionEvent
中。 在这个事件中,包含说与的触控数据。多个手指同时放在屏幕上的时候会触发以下的系统事件:
MotionEvent
中。getActionIndex()
获取到。 触碰的数据保存在这个index指定的MotionEvent
中。你可以通过触碰事件的index或者ID来获得事件MotionEvent
。
MotionEvent
存储了几根手指触摸屏幕的每一个手指的触碰数据。一般处理触摸 的是后都用index作为获取MotionEvent
的依据,而不是触碰ID。一个触碰的index在MotionEvent
中可能发生改变的。而整个触碰的ID是保持不变的,只要整个
getPointerId()
可以获取整个手势执行期间的每一个event里的触碰数据。 也可以通过findPointerIndex()
来根据一个触控的ID来获取这触控在触控事件中的index。比如: var mActivePointerId: Int? = nulloverride 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}
你应该使用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的代码没有什么太大的问题,基本上都一样。