258
CHAPTER 9: User Interface
Multitouch
Multitouch events in the Android OS are surprisingly easy to handle. All you need is
to overwrite the onTouchEvent() method of a View or a ViewGroup element.
Inside the
onTouchEvent(), you fetch the masked action and act upon it.
frog.setOnTouchListener { view, event ->
true
}
Note In older versions of Android, you usually dispatch on the action as in event.action. With
multitouch gestures, it is better to act on the maskedAction.
Inside
the listener, you get the masked action by event.actionMasked and pass it to a when()
{ .. } statement.
The magic now lies in this listener being invoked for all fingers (here called
pointers)
consecutively. To find out how many fingers currently are registered, you use event.
pointerCount, and if you want to know which finger the event belongs to you,
use val index
= event.actionIndex. A starting point is thus as follows:
theView.setOnTouchListener { view,event ->
fun actionToString(action:Int) : String = mapOf(
MotionEvent.ACTION_DOWN to "Down",
MotionEvent.ACTION_MOVE to "Move",
MotionEvent.ACTION_POINTER_DOWN to "Pointer Down",
MotionEvent.ACTION_UP to "Up",
MotionEvent.ACTION_POINTER_UP to "Pointer Up",
MotionEvent.ACTION_OUTSIDE to "Outside",
MotionEvent.ACTION_CANCEL to "Cancel").
getOrDefault(action,"")
val action = event.actionMasked
val index = event.actionIndex
var xPos = -1
var yPos = -1
Log.d("LOG", "The action is " +
actionToString(action))
if (event.pointerCount > 1) {
Log.d("LOG", "Multitouch event")
// The coordinates of the current screen contact,
// relative to the responding View or Activity.
xPos = event.getX(index).toInt()
yPos = event.getY(index).toInt()
} else {
// Single touch event