MotionEventCompat.java revision 0574ca37da4619afe4e26753f5a1b4de314b6565
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/** 220574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * Helper for accessing features in {@link MotionEvent} introduced 230574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * after API level 4 in a backwards compatible fashion. 24eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 25eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackbornpublic class MotionEventCompat { 26eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 27eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Interface for the full API. 28eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 29eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn interface MotionEventVersionImpl { 30eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int findPointerIndex(MotionEvent event, int pointerId); 31eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int getPointerId(MotionEvent event, int pointerIndex); 32eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getX(MotionEvent event, int pointerIndex); 33eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getY(MotionEvent event, int pointerIndex); 34eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 35eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 36eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 37eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Interface implementation that doesn't use anything about v4 APIs. 38eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 39eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static class BaseMotionEventVersionImpl implements MotionEventVersionImpl { 40eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 41eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int findPointerIndex(MotionEvent event, int pointerId) { 424fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell if (pointerId == 0) { 434fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell // id 0 == index 0 and vice versa. 444fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell return 0; 454fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell } 46eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return -1; 47eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 48eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 49eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int getPointerId(MotionEvent event, int pointerIndex) { 504fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell if (pointerIndex == 0) { 514fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell // index 0 == id 0 and vice versa. 524fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell return 0; 534fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell } 544fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers"); 55eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 56eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 57eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getX(MotionEvent event, int pointerIndex) { 584fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell if (pointerIndex == 0) { 594fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell return event.getX(); 604fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell } 614fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers"); 62eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 63eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 64eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getY(MotionEvent event, int pointerIndex) { 654fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell if (pointerIndex == 0) { 664fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell return event.getY(); 674fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell } 684fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers"); 69eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 70eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 71eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 72eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 73eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Interface implementation for devices with at least v11 APIs. 74eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 75eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static class EclairMotionEventVersionImpl implements MotionEventVersionImpl { 76eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 77eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int findPointerIndex(MotionEvent event, int pointerId) { 78eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return MotionEventCompatEclair.findPointerIndex(event, pointerId); 79eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 80eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 81eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public int getPointerId(MotionEvent event, int pointerIndex) { 82eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return MotionEventCompatEclair.getPointerId(event, pointerIndex); 83eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 84eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 85eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getX(MotionEvent event, int pointerIndex) { 86eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return MotionEventCompatEclair.getX(event, pointerIndex); 87eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 88eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn @Override 89eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public float getY(MotionEvent event, int pointerIndex) { 90eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return MotionEventCompatEclair.getY(event, pointerIndex); 91eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 92eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 93eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 94eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 95eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Select the correct implementation to use for the current platform. 96eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 97eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static final MotionEventVersionImpl IMPL; 98eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn static { 99eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn if (android.os.Build.VERSION.SDK_INT >= 5) { 100eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn IMPL = new EclairMotionEventVersionImpl(); 101eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } else { 102eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn IMPL = new BaseMotionEventVersionImpl(); 103eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 104eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 105eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 106eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn // ------------------------------------------------------------------- 107eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 108eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 109eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_MASK}. 110eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 111eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_MASK = 0xff; 112eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 113eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 114eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_POINTER_DOWN}. 115eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 116eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_POINTER_DOWN = 5; 117eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 118eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 119eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_POINTER_UP}. 120eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 121eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_POINTER_UP = 6; 122eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 123eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 124eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_HOVER_MOVE}. 125eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 126eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_HOVER_MOVE = 7; 127eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 128eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 129eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_SCROLL}. 130eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 131eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_SCROLL = 8; 132eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 133eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 134eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_MASK}. 135eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 136eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_POINTER_INDEX_MASK = 0xff00; 137eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 138eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 139eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_SHIFT}. 140eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 141eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static final int ACTION_POINTER_INDEX_SHIFT = 8; 142eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 143eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 144eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getAction}, returning only the {@link #ACTION_MASK} 145eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * portion. 146eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 147eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static int getActionMasked(MotionEvent event) { 148eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return event.getAction() & ACTION_MASK; 149eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 150eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 151eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 152eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getAction}, returning only the pointer index 153eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * portion 154eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 155eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static int getActionIndex(MotionEvent event) { 156eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return (event.getAction() & ACTION_POINTER_INDEX_MASK) 157eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn >> ACTION_POINTER_INDEX_SHIFT; 158eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 159eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 160eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 161eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#findPointerIndex(int)}. 1620574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device, 163eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * does nothing and returns -1. 164eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 165eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static int findPointerIndex(MotionEvent event, int pointerId) { 166eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return IMPL.findPointerIndex(event, pointerId); 167eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 168eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 169eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 170eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getPointerId(int)}. 1710574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device, 172eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * {@link IndexOutOfBoundsException} is thrown. 173eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 174eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static int getPointerId(MotionEvent event, int pointerIndex) { 175eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return IMPL.getPointerId(event, pointerIndex); 176eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 177eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 178eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 179eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getX(int)}. 1800574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device, 181eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * {@link IndexOutOfBoundsException} is thrown. 182eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 183eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static float getX(MotionEvent event, int pointerIndex) { 184eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return IMPL.getX(event, pointerIndex); 185eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 186eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 187eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn /** 188eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Call {@link MotionEvent#getY(int)}. 1890574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device, 190eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * {@link IndexOutOfBoundsException} is thrown. 191eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */ 192eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn public static float getY(MotionEvent event, int pointerIndex) { 193eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn return IMPL.getY(event, pointerIndex); 194eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn } 195eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn} 196