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