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