MotionEvent.java revision 9d2b0f4de03ca9bcdab5a3608dea5474c91faf86
1c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*
2c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copyright (C) 2007 The Android Open Source Project
3c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
4c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * you may not use this file except in compliance with the License.
6c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * You may obtain a copy of the License at
7c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
8c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
10c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Unless required by applicable law or agreed to in writing, software
11c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * See the License for the specific language governing permissions and
14c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * limitations under the License.
15c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */
16c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
17c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentpackage android.view;
18c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
19c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentimport android.os.Parcel;
2097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurentimport android.os.Parcelable;
21c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentimport android.os.SystemClock;
22c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
23c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/**
24c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Object used to report movement (mouse, pen, finger, trackball) events.  This
25c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * class may hold either absolute or relative movements, depending on what
26c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * it is being used for.
27c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */
28c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentpublic final class MotionEvent implements Parcelable {
29c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
30c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Constant for {@link #getAction}: A pressed gesture has started, the
31c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * motion contains the initial starting location.
32c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
33c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public static final int ACTION_DOWN             = 0;
34c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
35c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Constant for {@link #getAction}: A pressed gesture has finished, the
36c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * motion contains the final release location as well as any intermediate
37c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * points since the last down or move event.
38c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
39c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public static final int ACTION_UP               = 1;
40c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
41c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Constant for {@link #getAction}: A change has happened during a
42c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}).
43c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * The motion contains the most recent point, as well as any intermediate
44c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * points since the last down or move event.
45c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
46c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public static final int ACTION_MOVE             = 2;
47c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
48c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Constant for {@link #getAction}: The current gesture has been aborted.
49c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * You will not receive any more points in it.  You should treat this as
50c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * an up event, but not perform any action that you normally would.
51c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
52c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public static final int ACTION_CANCEL           = 3;
53c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
54c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Constant for {@link #getAction}: A movement has happened outside of the
55c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * normal bounds of the UI element.  This does not provide a full gesture,
56c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * but only the initial location of the movement/touch.
57c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
5897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    public static final int ACTION_OUTSIDE          = 4;
5997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
6097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private static final boolean TRACK_RECYCLED_LOCATION = false;
6197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
6297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
6397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * Flag indicating the motion event intersected the top edge of the screen.
6497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     */
6597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    public static final int EDGE_TOP = 0x00000001;
6697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
6797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
6897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * Flag indicating the motion event intersected the bottom edge of the screen.
6997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     */
7097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    public static final int EDGE_BOTTOM = 0x00000002;
7197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
7297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
7397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * Flag indicating the motion event intersected the left edge of the screen.
7497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     */
7597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    public static final int EDGE_LEFT = 0x00000004;
7697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
7797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
78c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Flag indicating the motion event intersected the right edge of the screen.
79c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
80c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public static final int EDGE_RIGHT = 0x00000008;
8197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
82d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    static private final int MAX_RECYCLED = 10;
83d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    static private Object gRecyclerLock = new Object();
8497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    static private int gRecyclerUsed = 0;
8597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    static private MotionEvent gRecyclerTop = null;
8697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
8797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private long mDownTime;
8897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private long mEventTime;
8997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private long mEventTimeNano;
9097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private int mAction;
9197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private float mX;
9297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private float mY;
9397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private float mRawX;
94d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    private float mRawY;
95d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    private float mPressure;
9697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private float mSize;
97c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    private int mMetaState;
98c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    private int mNumHistory;
99c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    private float[] mHistory;
10097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private long[] mHistoryTimes;
10197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private float mXPrecision;
10297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private float mYPrecision;
10397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private int mDeviceId;
10497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private int mEdgeFlags;
10597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
106d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    private MotionEvent mNext;
107d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    private RuntimeException mRecycledLocation;
10897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private boolean mRecycled;
10997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
11097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    private MotionEvent() {
11197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    }
11297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
11397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    static private MotionEvent obtain() {
11497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        synchronized (gRecyclerLock) {
11597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            if (gRecyclerTop == null) {
11697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent                return new MotionEvent();
11797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            }
118d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent            MotionEvent ev = gRecyclerTop;
119d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent            gRecyclerTop = ev.mNext;
12097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            gRecyclerUsed--;
12197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            ev.mRecycledLocation = null;
12297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            ev.mRecycled = false;
12397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            return ev;
12497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        }
12597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    }
12697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
12797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
12897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * Create a new MotionEvent, filling in all of the basic values that
12997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * define the motion.
13097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     *
13197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @param downTime The time (in ms) when the user originally pressed down to start
132c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
133c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param eventTime  The the time (in ms) when this specific event was generated.  This
134c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * must be obtained from {@link SystemClock#uptimeMillis()}.
135c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param eventTimeNano  The the time (in ns) when this specific event was generated.  This
136c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * must be obtained from {@link System#nanoTime()}.
137c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param action The kind of action being performed -- one of either
138c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
139c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #ACTION_CANCEL}.
140c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param x The X coordinate of this event.
141c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param y The Y coordinate of this event.
142c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param pressure The current pressure of this event.  The pressure generally
143c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
144c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * values higher than 1 may be generated depending on the calibration of
145c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * the input device.
146c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param size A scaled value of the approximate size of the area being pressed when
147c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * touched with the finger. The actual value in pixels corresponding to the finger
148c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * touch is normalized with a device specific range of values
149d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent     * and scaled to a value between 0 and 1.
150d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent     * @param metaState The state of any meta / modifier keys that were in effect when
15197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * the event was generated.
15297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @param xPrecision The precision of the X coordinate being reported.
15397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @param yPrecision The precision of the Y coordinate being reported.
15497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @param deviceId The id for the device that this event came from.  An id of
155c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * zero indicates that the event didn't come from a physical device; other
156c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * numbers are arbitrary and you shouldn't depend on the values.
15797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
15897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * MotionEvent.
159c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
160c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @hide
161c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
162c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    static public MotionEvent obtainNano(long downTime, long eventTime, long eventTimeNano,
163c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            int action, float x, float y, float pressure, float size, int metaState,
164c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
165c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MotionEvent ev = obtain();
166c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mDeviceId = deviceId;
167c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEdgeFlags = edgeFlags;
16897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        ev.mDownTime = downTime;
169c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEventTime = eventTime;
170c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEventTimeNano = eventTimeNano;
171c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mAction = action;
172c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mX = ev.mRawX = x;
17397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        ev.mY = ev.mRawY = y;
174c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mPressure = pressure;
175c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mSize = size;
176c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mMetaState = metaState;
177c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mXPrecision = xPrecision;
178c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mYPrecision = yPrecision;
179c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
180c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return ev;
181c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
182c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
183c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
184c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Create a new MotionEvent, filling in all of the basic values that
185c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * define the motion.
18697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     *
187c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param downTime The time (in ms) when the user originally pressed down to start
188c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
189c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param eventTime  The the time (in ms) when this specific event was generated.  This
19097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * must be obtained from {@link SystemClock#uptimeMillis()}.
191c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param action The kind of action being performed -- one of either
192c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
193c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #ACTION_CANCEL}.
194c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param x The X coordinate of this event.
195c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param y The Y coordinate of this event.
196c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param pressure The current pressure of this event.  The pressure generally
197c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
198c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * values higher than 1 may be generated depending on the calibration of
199c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * the input device.
200c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param size A scaled value of the approximate size of the area being pressed when
20197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * touched with the finger. The actual value in pixels corresponding to the finger
20297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * touch is normalized with a device specific range of values
203c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and scaled to a value between 0 and 1.
204c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param metaState The state of any meta / modifier keys that were in effect when
205c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * the event was generated.
206c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param xPrecision The precision of the X coordinate being reported.
207c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param yPrecision The precision of the Y coordinate being reported.
208c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param deviceId The id for the device that this event came from.  An id of
209c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * zero indicates that the event didn't come from a physical device; other
210c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * numbers are arbitrary and you shouldn't depend on the values.
21197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
21297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * MotionEvent.
21397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     */
21497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    static public MotionEvent obtain(long downTime, long eventTime, int action,
21597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            float x, float y, float pressure, float size, int metaState,
21697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
21797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        MotionEvent ev = obtain();
21897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        ev.mDeviceId = deviceId;
21997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        ev.mEdgeFlags = edgeFlags;
22097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        ev.mDownTime = downTime;
221c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEventTime = eventTime;
222c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEventTimeNano = eventTime * 1000000;
223c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mAction = action;
224c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mX = ev.mRawX = x;
225c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mY = ev.mRawY = y;
226c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mPressure = pressure;
227c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mSize = size;
22897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        ev.mMetaState = metaState;
22997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        ev.mXPrecision = xPrecision;
23097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        ev.mYPrecision = yPrecision;
23197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
23297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        return ev;
23397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    }
23497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
23597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
23697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * Create a new MotionEvent, filling in a subset of the basic motion
23797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * values.  Those not specified here are: device id (always 0), pressure
23897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * and size (always 1), x and y precision (always 1), and edgeFlags (always 0).
23997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     *
24097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @param downTime The time (in ms) when the user originally pressed down to start
241c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
242c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param eventTime  The the time (in ms) when this specific event was generated.  This
243c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * must be obtained from {@link SystemClock#uptimeMillis()}.
244c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param action The kind of action being performed -- one of either
245c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
246c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #ACTION_CANCEL}.
247c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param x The X coordinate of this event.
248c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param y The Y coordinate of this event.
249c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param metaState The state of any meta / modifier keys that were in effect when
250c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * the event was generated.
251c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
252c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    static public MotionEvent obtain(long downTime, long eventTime, int action,
253c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            float x, float y, int metaState) {
254c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MotionEvent ev = obtain();
255c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mDeviceId = 0;
256c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEdgeFlags = 0;
257c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mDownTime = downTime;
258c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEventTime = eventTime;
259c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEventTimeNano = eventTime * 1000000;
260c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mAction = action;
261c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mX = ev.mRawX = x;
262c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mY = ev.mRawY = y;
263c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mPressure = 1.0f;
264c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mSize = 1.0f;
265d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        ev.mMetaState = metaState;
266d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        ev.mXPrecision = 1.0f;
267d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        ev.mYPrecision = 1.0f;
268d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent
269d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        return ev;
270c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
271c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
272c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
273c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Scales down the cood of this event by the given scale.
274c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
275c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @hide
276c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
277c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public void scale(float scale) {
278c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if (scale != 1.0f) {
279c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mX *= scale;
280c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mY *= scale;
281c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mRawX *= scale;
282c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mRawY *= scale;
283c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mSize *= scale;
284c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mXPrecision *= scale;
285c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mYPrecision *= scale;
286c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            if (mHistory != null) {
287c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                float[] history = mHistory;
288d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent                int length = history.length;
289d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent                for (int i = 0; i < length; i += 4) {
290c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    history[i] *= scale;        // X
291c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                                // history[i + 2] == pressure
292c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    history[i + 1] *= scale;    // Y
293c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    history[i + 3] *= scale;    // Size, TODO: square this?
294c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                }
295c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
296c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
297c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
298c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
299c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
300c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Create a new MotionEvent, copying from an existing one.
301c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
302c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    static public MotionEvent obtain(MotionEvent o) {
303c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MotionEvent ev = obtain();
304c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mDeviceId = o.mDeviceId;
305c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEdgeFlags = o.mEdgeFlags;
306c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mDownTime = o.mDownTime;
307c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEventTime = o.mEventTime;
308c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mEventTimeNano = o.mEventTimeNano;
309c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mAction = o.mAction;
310c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mX = o.mX;
311c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mRawX = o.mRawX;
312c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mY = o.mY;
313c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mRawY = o.mRawY;
314c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mPressure = o.mPressure;
315c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mSize = o.mSize;
316c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mMetaState = o.mMetaState;
317c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mXPrecision = o.mXPrecision;
318c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mYPrecision = o.mYPrecision;
319c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        final int N = o.mNumHistory;
320c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        ev.mNumHistory = N;
321c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if (N > 0) {
322c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            // could be more efficient about this...
323c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            ev.mHistory = (float[])o.mHistory.clone();
324c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            ev.mHistoryTimes = (long[])o.mHistoryTimes.clone();
325c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
326c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return ev;
327c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
328c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
329c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
330c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Recycle the MotionEvent, to be re-used by a later caller.  After calling
331c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * this function you must not ever touch the event again.
332c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
333c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public void recycle() {
334c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        // Ensure recycle is only called once!
335c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if (TRACK_RECYCLED_LOCATION) {
336c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            if (mRecycledLocation != null) {
337c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation);
338c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
339c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mRecycledLocation = new RuntimeException("Last recycled here");
340c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        } else if (mRecycled) {
341c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            throw new RuntimeException(toString() + " recycled twice!");
342c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
343c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
344c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        //Log.w("MotionEvent", "Recycling event " + this, mRecycledLocation);
345c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        synchronized (gRecyclerLock) {
346c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            if (gRecyclerUsed < MAX_RECYCLED) {
347c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                gRecyclerUsed++;
348c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                mNumHistory = 0;
349c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                mNext = gRecyclerTop;
350c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                gRecyclerTop = this;
351c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
352c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
353c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
354c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
355c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
356c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Return the kind of action being performed -- one of either
357c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
358c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #ACTION_CANCEL}.
359c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
360c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final int getAction() {
36197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        return mAction;
36297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    }
36397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
36497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
36597344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * Returns the time (in ms) when the user originally pressed down to start
36697344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * a stream of position events.
36797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     */
36897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    public final long getDownTime() {
369c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mDownTime;
370c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
371c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
372c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
373c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the time (in ms) when this specific event was generated.
374c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
375c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final long getEventTime() {
376c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mEventTime;
377c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
378c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
379c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
380c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent<<<<<<< HEAD:core/java/android/view/MotionEvent.java
381c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the time (in ns) when this specific event was generated.
382c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * The value is in nanosecond precision but it may not have nanosecond accuracy.
383c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
384c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @hide
385c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
386c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final long getEventTimeNano() {
387c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mEventTimeNano;
388c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
389c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
390c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
391c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the X coordinate of this event.  Whole numbers are pixels; the
392c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * value may have a fraction for input devices that are sub-pixel precise.
393c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent|||||||
394c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the X coordinate of this event.  Whole numbers are pixels; the
395c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * value may have a fraction for input devices that are sub-pixel precise.
396c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent=======
397c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the X coordinate of this event.  Whole numbers are pixels; the
398c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * value may have a fraction for input devices that are sub-pixel precise.
399c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent>>>>>>> cafdea61a85c8f5d0646cc9413a09346c637f43f:core/java/android/view/MotionEvent.java
400c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
401c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getX() {
402c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mX;
403c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
404c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
405c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
406c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the Y coordinate of this event.  Whole numbers are pixels; the
407d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent     * value may have a fraction for input devices that are sub-pixel precise.
408d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent     */
409c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getY() {
410c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mY;
411d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    }
412c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
413c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
414c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the current pressure of this event.  The pressure generally
415c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
416c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * values higher than 1 may be generated depending on the calibration of
417c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * the input device.
418c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
419c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getPressure() {
420c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mPressure;
42197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    }
42297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
42397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
424c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns a scaled value of the approximate size, of the area being pressed when
425c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * touched with the finger. The actual value in pixels corresponding to the finger
426d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent     * touch  is normalized with the device specific range of values
427c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and scaled to a value between 0 and 1. The value of size can be used to
428c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * determine fat touch events.
429c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
430c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getSize() {
431c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mSize;
432d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    }
433c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
434c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
435c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the state of any meta / modifier keys that were in effect when
436c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * the event was generated.  This is the same values as those
437c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * returned by {@link KeyEvent#getMetaState() KeyEvent.getMetaState}.
438c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
43997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @return an integer in which each bit set to 1 represents a pressed
440d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent     *         meta key
44197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     *
442c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see KeyEvent#getMetaState()
443c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
444d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    public final int getMetaState() {
445d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        return mMetaState;
446c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
44797344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
44897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
44997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * Returns the original raw X coordinate of this event.  For touch
45097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * events on the screen, this is the original location of the event
451d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent     * on the screen, before it had been adjusted for the containing window
45297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * and views.
45397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     */
454c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getRawX() {
455c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mRawX;
456c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
457c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
458c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
459c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the original raw Y coordinate of this event.  For touch
460d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent     * events on the screen, this is the original location of the event
461c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * on the screen, before it had been adjusted for the containing window
462c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and views.
463c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
464c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getRawY() {
465c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mRawY;
466c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
467c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
468c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
469c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Return the precision of the X coordinates being reported.  You can
470c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * multiple this number with {@link #getX} to find the actual hardware
471c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * value of the X coordinate.
47297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @return Returns the precision of X coordinates being reported.
473c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
474c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getXPrecision() {
475c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mXPrecision;
476c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
477c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
478c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
479c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Return the precision of the Y coordinates being reported.  You can
480c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * multiple this number with {@link #getY} to find the actual hardware
481c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * value of the Y coordinate.
482c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @return Returns the precision of Y coordinates being reported.
483c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
484c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getYPrecision() {
485c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mYPrecision;
486c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
487c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
488c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
489c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the number of historical points in this event.  These are
490c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * movements that have occurred between this event and the previous event.
491c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * This only applies to ACTION_MOVE events -- all other actions will have
492c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * a size of 0.
493c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
494c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @return Returns the number of historical points in the event.
495c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
496c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final int getHistorySize() {
497c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mNumHistory;
498c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
499c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
500c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
501c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns the time that a historical movement occurred between this event
502c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and the previous event.  Only applies to ACTION_MOVE events.
503c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
504c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param pos Which historical value to return; must be less than
505c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #getHistorySize}
506c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
507c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getHistorySize
508c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getEventTime
509c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
510c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final long getHistoricalEventTime(int pos) {
511c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mHistoryTimes[pos];
512c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
513c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
514c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
515c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns a historical X coordinate that occurred between this event
516c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and the previous event.  Only applies to ACTION_MOVE events.
517c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
518c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param pos Which historical value to return; must be less than
519c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #getHistorySize}
520c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
521c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getHistorySize
522c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getX
523c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
524c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getHistoricalX(int pos) {
525c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mHistory[pos*4];
526c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
527c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
528c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
529c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns a historical Y coordinate that occurred between this event
530c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and the previous event.  Only applies to ACTION_MOVE events.
531c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
532c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param pos Which historical value to return; must be less than
533c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #getHistorySize}
534c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
535c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getHistorySize
536c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getY
537c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
538c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getHistoricalY(int pos) {
539c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mHistory[pos*4 + 1];
540c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
541c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
542c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
543c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns a historical pressure coordinate that occurred between this event
544c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and the previous event.  Only applies to ACTION_MOVE events.
545c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
546c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param pos Which historical value to return; must be less than
547c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #getHistorySize}
548c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
54997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @see #getHistorySize
55097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent     * @see #getPressure
551c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
552c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getHistoricalPressure(int pos) {
553c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mHistory[pos*4 + 2];
554c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
555c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
556c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
557c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns a historical size coordinate that occurred between this event
558c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and the previous event.  Only applies to ACTION_MOVE events.
559c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
560c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param pos Which historical value to return; must be less than
561c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * {@link #getHistorySize}
562c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
563c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getHistorySize
564c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getSize
565c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
566c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final float getHistoricalSize(int pos) {
567c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mHistory[pos*4 + 3];
568c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
569c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
570c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
571c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Return the id for the device that this event came from.  An id of
572c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * zero indicates that the event didn't come from a physical device; other
573c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * numbers are arbitrary and you shouldn't depend on the values.
574c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
575c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final int getDeviceId() {
576c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mDeviceId;
577c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
578c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
579c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
580c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Returns a bitfield indicating which edges, if any, where touched by this
581c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * MotionEvent. For touch events, clients can use this to determine if the
582c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * user's finger was touching the edge of the display.
583c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
584c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #EDGE_LEFT
585c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #EDGE_TOP
586c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #EDGE_RIGHT
587c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #EDGE_BOTTOM
588c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
589c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final int getEdgeFlags() {
590c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return mEdgeFlags;
591c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
592c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
593c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
594c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
595c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Sets the bitfield indicating which edges, if any, where touched by this
596c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * MotionEvent.
597c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
598c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @see #getEdgeFlags()
599c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
600c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final void setEdgeFlags(int flags) {
601c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mEdgeFlags = flags;
602c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
603c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
604c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
605c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Sets this event's action.
606c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
607c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final void setAction(int action) {
608c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mAction = action;
609c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
610c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
611c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
612c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Adjust this event's location.
613c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param deltaX Amount to add to the current X coordinate of the event.
614c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param deltaY Amount to add to the current Y coordinate of the event.
615c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
616c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final void offsetLocation(float deltaX, float deltaY) {
617c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mX += deltaX;
618c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mY += deltaY;
619c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        final int N = mNumHistory*4;
620c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if (N <= 0) {
621c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            return;
622c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
623c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        final float[] pos = mHistory;
624c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        for (int i=0; i<N; i+=4) {
625c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            pos[i] += deltaX;
626c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            pos[i+1] += deltaY;
627c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
628c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
629c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
63097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    /**
631c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Set this event's location.  Applies {@link #offsetLocation} with a
632c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * delta from the current location to the given new location.
633c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
634c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param x New absolute X location.
635c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param y New absolute Y location.
636c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
637c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final void setLocation(float x, float y) {
638c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        float deltaX = x-mX;
63997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        float deltaY = y-mY;
64097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        if (deltaX != 0 || deltaY != 0) {
64197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            offsetLocation(deltaX, deltaY);
64297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent        }
64397344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent    }
64497344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent
645c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /**
646c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Add a new movement to the batch of movements in this event.  The event's
647c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * current location, position and size is updated to the new values.  In
648c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * the future, the current values in the event will be added to a list of
649c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * historic values.
650c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *
651c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param x The new X position.
652c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param y The new Y position.
653c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param pressure The new pressure.
654c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * @param size The new size.
655c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
656c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public final void addBatch(long eventTime, float x, float y,
657c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            float pressure, float size, int metaState) {
658c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        float[] history = mHistory;
659c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        long[] historyTimes = mHistoryTimes;
660c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        int N;
661c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        int avail;
662c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if (history == null) {
663c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mHistory = history = new float[8*4];
664c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mHistoryTimes = historyTimes = new long[8];
665c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            mNumHistory = N = 0;
666c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            avail = 8;
667c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        } else {
668c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            N = mNumHistory;
669c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            avail = history.length/4;
670c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            if (N == avail) {
671c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                avail += 8;
672c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                float[] newHistory = new float[avail*4];
673c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                System.arraycopy(history, 0, newHistory, 0, N*4);
674c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                mHistory = history = newHistory;
675c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                long[] newHistoryTimes = new long[avail];
676c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                System.arraycopy(historyTimes, 0, newHistoryTimes, 0, N);
677c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                mHistoryTimes = historyTimes = newHistoryTimes;
678c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
679c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
680c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
681c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        historyTimes[N] = mEventTime;
682c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
683c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        final int pos = N*4;
684c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        history[pos] = mX;
685c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        history[pos+1] = mY;
686c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        history[pos+2] = mPressure;
687d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        history[pos+3] = mSize;
688d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        mNumHistory = N+1;
689c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
690c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mEventTime = eventTime;
691c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mX = mRawX = x;
692c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mY = mRawY = y;
693c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mPressure = pressure;
694c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mSize = size;
695c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mMetaState |= metaState;
696c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
697c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
698c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    @Override
699c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public String toString() {
700c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return "MotionEvent{" + Integer.toHexString(System.identityHashCode(this))
701c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            + " action=" + mAction + " x=" + mX
702c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            + " y=" + mY + " pressure=" + mPressure + " size=" + mSize + "}";
703d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    }
704d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent
705c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public static final Parcelable.Creator<MotionEvent> CREATOR
706d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent            = new Parcelable.Creator<MotionEvent>() {
707d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        public MotionEvent createFromParcel(Parcel in) {
708d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent            MotionEvent ev = obtain();
709c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            ev.readFromParcel(in);
710c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            return ev;
711c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
712c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
713c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        public MotionEvent[] newArray(int size) {
714c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            return new MotionEvent[size];
715c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
716c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    };
717c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
718c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public int describeContents() {
719c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return 0;
720c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
721c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
722c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    public void writeToParcel(Parcel out, int flags) {
723c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeLong(mDownTime);
724c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeLong(mEventTime);
725c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeLong(mEventTimeNano);
726c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeInt(mAction);
727c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeFloat(mX);
728c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeFloat(mY);
729c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeFloat(mPressure);
730c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeFloat(mSize);
731c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeInt(mMetaState);
732c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeFloat(mRawX);
733c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeFloat(mRawY);
734c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        final int N = mNumHistory;
735c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeInt(N);
736c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if (N > 0) {
737c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            final int N4 = N*4;
73897344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            int i;
73997344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            float[] history = mHistory;
74097344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            for (i=0; i<N4; i++) {
74197344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent                out.writeFloat(history[i]);
74297344f1d8e8e95fd07d5deee2ae2492a7e4c24b0Eric Laurent            }
743c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            long[] times = mHistoryTimes;
744c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            for (i=0; i<N; i++) {
745c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                out.writeLong(times[i]);
746c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
747c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
748c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeFloat(mXPrecision);
749c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeFloat(mYPrecision);
750c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeInt(mDeviceId);
751c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        out.writeInt(mEdgeFlags);
752d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    }
753c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
754c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    private void readFromParcel(Parcel in) {
755c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mDownTime = in.readLong();
756c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mEventTime = in.readLong();
757c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mEventTimeNano = in.readLong();
758c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mAction = in.readInt();
759c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mX = in.readFloat();
760c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mY = in.readFloat();
761c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mPressure = in.readFloat();
762c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mSize = in.readFloat();
763c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mMetaState = in.readInt();
764c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mRawX = in.readFloat();
765c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mRawY = in.readFloat();
766c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        final int N = in.readInt();
767c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if ((mNumHistory=N) > 0) {
768c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            final int N4 = N*4;
769c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            float[] history = mHistory;
770c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            if (history == null || history.length < N4) {
771c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                mHistory = history = new float[N4 + (4*4)];
772c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
773c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            for (int i=0; i<N4; i++) {
774c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                history[i] = in.readFloat();
775c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
776c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            long[] times = mHistoryTimes;
777c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            if (times == null || times.length < N) {
778c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                mHistoryTimes = times = new long[N + 4];
779c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
780c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            for (int i=0; i<N; i++) {
781c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                times[i] = in.readLong();
782c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
783c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
784c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mXPrecision = in.readFloat();
785c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mYPrecision = in.readFloat();
786c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mDeviceId = in.readInt();
787c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        mEdgeFlags = in.readInt();
788c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
789c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
790c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent}
791c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent