MotionEventCompat.java revision 4fb2aa8fb492e12ed48daa4f025e0bfac00a2514
1eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn/* 2eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * 4eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * you may not use this file except in compliance with the License. 6eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * You may obtain a copy of the License at 7eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * 8eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * 10eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * See the License for the specific language governing permissions and 14eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * limitations under the License. 15eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 16eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 17eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackbornpackage android.support.v4.view; 18eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 19eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackbornimport android.view.MotionEvent; 20eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 21eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn/** 22eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Helper for accessing newer features in MotionEvent. 23eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 24eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackbornpublic class MotionEventCompat { 25eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 26eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Interface for the full API. 27eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 28eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn interface MotionEventVersionImpl { 29eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int findPointerIndex(MotionEvent event, int pointerId); 30eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int getPointerId(MotionEvent event, int pointerIndex); 31eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getX(MotionEvent event, int pointerIndex); 32eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getY(MotionEvent event, int pointerIndex); 33eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 34eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 35eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 36eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Interface implementation that doesn't use anything about v4 APIs. 37eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 38eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static class BaseMotionEventVersionImpl implements MotionEventVersionImpl { 39eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 40eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int findPointerIndex(MotionEvent event, int pointerId) { 414fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell if (pointerId == 0) { 424fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell // id 0 == index 0 and vice versa. 434fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell return 0; 444fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell } 45eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return -1; 46eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 47eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 48eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int getPointerId(MotionEvent event, int pointerIndex) { 494fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell if (pointerIndex == 0) { 504fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell // index 0 == id 0 and vice versa. 514fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell return 0; 524fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell } 534fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers"); 54eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 55eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 56eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getX(MotionEvent event, int pointerIndex) { 574fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell if (pointerIndex == 0) { 584fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell return event.getX(); 594fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell } 604fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers"); 61eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 62eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 63eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getY(MotionEvent event, int pointerIndex) { 644fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell if (pointerIndex == 0) { 654fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell return event.getY(); 664fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell } 674fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers"); 68eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 69eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 70eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 71eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 72eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Interface implementation for devices with at least v11 APIs. 73eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 74eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static class EclairMotionEventVersionImpl implements MotionEventVersionImpl { 75eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 76eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int findPointerIndex(MotionEvent event, int pointerId) { 77eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return MotionEventCompatEclair.findPointerIndex(event, pointerId); 78eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 79eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 80eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int getPointerId(MotionEvent event, int pointerIndex) { 81eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return MotionEventCompatEclair.getPointerId(event, pointerIndex); 82eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 83eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 84eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getX(MotionEvent event, int pointerIndex) { 85eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return MotionEventCompatEclair.getX(event, pointerIndex); 86eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 87eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 88eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getY(MotionEvent event, int pointerIndex) { 89eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return MotionEventCompatEclair.getY(event, pointerIndex); 90eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 91eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 92eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 93eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 94eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Select the correct implementation to use for the current platform. 95eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 96eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static final MotionEventVersionImpl IMPL; 97eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static { 98eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn if (android.os.Build.VERSION.SDK_INT >= 5) { 99eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn IMPL = new EclairMotionEventVersionImpl(); 100eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } else { 101eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn IMPL = new BaseMotionEventVersionImpl(); 102eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 103eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 104eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 105eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn // ------------------------------------------------------------------- 106eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 107eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 108eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_MASK}. 109eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 110eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_MASK = 0xff; 111eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 112eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 113eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_POINTER_DOWN}. 114eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 115eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_POINTER_DOWN = 5; 116eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 117eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 118eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_POINTER_UP}. 119eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 120eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_POINTER_UP = 6; 121eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 122eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 123eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_HOVER_MOVE}. 124eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 125eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_HOVER_MOVE = 7; 126eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 127eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 128eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_SCROLL}. 129eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 130eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_SCROLL = 8; 131eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 132eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 133eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_MASK}. 134eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 135eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_POINTER_INDEX_MASK = 0xff00; 136eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 137eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 138eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_SHIFT}. 139eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 140eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_POINTER_INDEX_SHIFT = 8; 141eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 142eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 143eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getAction}, returning only the {@link #ACTION_MASK} 144eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * portion. 145eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 146eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static int getActionMasked(MotionEvent event) { 147eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return event.getAction() & ACTION_MASK; 148eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 149eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 150eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 151eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getAction}, returning only the pointer index 152eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * portion 153eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 154eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static int getActionIndex(MotionEvent event) { 155eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return (event.getAction() & ACTION_POINTER_INDEX_MASK) 156eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn >> ACTION_POINTER_INDEX_SHIFT; 157eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 158eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 159eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 160eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#findPointerIndex(int)}. 161eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, 162eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * does nothing and returns -1. 163eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 164eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static int findPointerIndex(MotionEvent event, int pointerId) { 165eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return IMPL.findPointerIndex(event, pointerId); 166eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 167eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 168eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 169eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getPointerId(int)}. 170eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, 171eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * {@link IndexOutOfBoundsException} is thrown. 172eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 173eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static int getPointerId(MotionEvent event, int pointerIndex) { 174eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return IMPL.getPointerId(event, pointerIndex); 175eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 176eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 177eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 178eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getX(int)}. 179eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, 180eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * {@link IndexOutOfBoundsException} is thrown. 181eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 182eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static float getX(MotionEvent event, int pointerIndex) { 183eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return IMPL.getX(event, pointerIndex); 184eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 185eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 186eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 187eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getY(int)}. 188eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, 189eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * {@link IndexOutOfBoundsException} is thrown. 190eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 191eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static float getY(MotionEvent event, int pointerIndex) { 192eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return IMPL.getY(event, pointerIndex); 193eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 194eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn} 195