MotionEvent.java revision d41ba666d12a24ee4624ea9a009151e6165e3775
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackbornimport android.util.Log; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Object used to report movement (mouse, pen, finger, trackball) events. This 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class may hold either absolute or relative movements, depending on what 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is being used for. 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class MotionEvent implements Parcelable { 300dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn static final boolean DEBUG_POINTERS = false; 310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Bit mask of the parts of the action code that are the action itself. 349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_MASK = 0xff; 369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant for {@link #getAction}: A pressed gesture has started, the 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * motion contains the initial starting location. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ACTION_DOWN = 0; 429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant for {@link #getAction}: A pressed gesture has finished, the 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * motion contains the final release location as well as any intermediate 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * points since the last down or move event. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ACTION_UP = 1; 499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant for {@link #getAction}: A change has happened during a 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}). 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The motion contains the most recent point, as well as any intermediate 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * points since the last down or move event. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ACTION_MOVE = 2; 579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant for {@link #getAction}: The current gesture has been aborted. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You will not receive any more points in it. You should treat this as 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an up event, but not perform any action that you normally would. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ACTION_CANCEL = 3; 649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant for {@link #getAction}: A movement has happened outside of the 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * normal bounds of the UI element. This does not provide a full gesture, 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but only the initial location of the movement/touch. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ACTION_OUTSIDE = 4; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * A non-primary pointer has gone down. The bits in 740dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed. 759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 769822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_POINTER_DOWN = 5; 779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Synonym for {@link #ACTION_POINTER_DOWN} with 800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #ACTION_POINTER_ID_MASK} of 0: the primary pointer has gone done. 819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_POINTER_1_DOWN = ACTION_POINTER_DOWN | 0x0000; 839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Synonym for {@link #ACTION_POINTER_DOWN} with 860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #ACTION_POINTER_ID_MASK} of 1: the secondary pointer has gone done. 879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_POINTER_2_DOWN = ACTION_POINTER_DOWN | 0x0100; 899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Synonym for {@link #ACTION_POINTER_DOWN} with 920dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #ACTION_POINTER_ID_MASK} of 2: the tertiary pointer has gone done. 939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_POINTER_3_DOWN = ACTION_POINTER_DOWN | 0x0200; 959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * A non-primary pointer has gone up. The bits in 980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed. 999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_POINTER_UP = 6; 1019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Synonym for {@link #ACTION_POINTER_UP} with 1040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #ACTION_POINTER_ID_MASK} of 0: the primary pointer has gone up. 1059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_POINTER_1_UP = ACTION_POINTER_UP | 0x0000; 1079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1090dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Synonym for {@link #ACTION_POINTER_UP} with 1100dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #ACTION_POINTER_ID_MASK} of 1: the secondary pointer has gone up. 1119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_POINTER_2_UP = ACTION_POINTER_UP | 0x0100; 1139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Synonym for {@link #ACTION_POINTER_UP} with 1160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #ACTION_POINTER_ID_MASK} of 2: the tertiary pointer has gone up. 1179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public static final int ACTION_POINTER_3_UP = ACTION_POINTER_UP | 0x0200; 1199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Bits in the action code that represent a pointer ID, used with 1229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * {@link #ACTION_POINTER_DOWN} and {@link #ACTION_POINTER_UP}. Pointer IDs 1230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * start at 0, with 0 being the primary (first) pointer in the motion. Note 1240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * that this not <em>not</em> an index into the array of pointer values, 1250dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * which is compacted to only contain pointers that are down; the pointer 1260dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * ID for a particular index can be found with {@link #findPointerIndex}. 1279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1280dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public static final int ACTION_POINTER_ID_MASK = 0xff00; 1299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Bit shift for the action bits holding the pointer identifier as 1320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * defined by {@link #ACTION_POINTER_ID_MASK}. 1339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public static final int ACTION_POINTER_ID_SHIFT = 8; 1359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean TRACK_RECYCLED_LOCATION = false; 137cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag indicating the motion event intersected the top edge of the screen. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int EDGE_TOP = 0x00000001; 142cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag indicating the motion event intersected the bottom edge of the screen. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int EDGE_BOTTOM = 0x00000002; 147cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag indicating the motion event intersected the left edge of the screen. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int EDGE_LEFT = 0x00000004; 152cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag indicating the motion event intersected the right edge of the screen. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int EDGE_RIGHT = 0x00000008; 157cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 1589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Offset for the sample's X coordinate. 1609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @hide 1619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn static public final int SAMPLE_X = 0; 1639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Offset for the sample's Y coordinate. 1669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @hide 1679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn static public final int SAMPLE_Y = 1; 1699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Offset for the sample's X coordinate. 1729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @hide 1739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn static public final int SAMPLE_PRESSURE = 2; 1759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1769822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Offset for the sample's X coordinate. 1789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @hide 1799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn static public final int SAMPLE_SIZE = 3; 1819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 1839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Number of data items for each sample. 1849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @hide 1859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 1869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn static public final int NUM_SAMPLE_DATA = 4; 1879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn static private final int BASE_AVAIL_POINTERS = 2; 1899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn static private final int BASE_AVAIL_SAMPLES = 8; 1909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private final int MAX_RECYCLED = 10; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private Object gRecyclerLock = new Object(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private int gRecyclerUsed = 0; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private MotionEvent gRecyclerTop = null; 195cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mDownTime; 19753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan private long mEventTimeNano; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAction; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mRawX; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mRawY; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mXPrecision; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mYPrecision; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDeviceId; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mEdgeFlags; 2059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn private int mMetaState; 2069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 2079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn // Here is the actual event data. Note that the order of the array 2089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn // is a little odd: the first entry is the most recent, and the ones 2099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn // following it are the historical data from oldest to newest. This 2109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn // allows us to easily retrieve the most recent data, without having 2119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn // to copy the arrays every time a new sample is added. 2129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 2139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn private int mNumPointers; 2149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn private int mNumSamples; 2150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn // Array of mNumPointers size of identifiers for each pointer of data. 2160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn private int[] mPointerIdentifiers; 2179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn // Array of (mNumSamples * mNumPointers * NUM_SAMPLE_DATA) size of event data. 2189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn private float[] mDataSamples; 2199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn // Array of mNumSamples size of time stamps. 2209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn private long[] mTimeSamples; 2218169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MotionEvent mNext; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RuntimeException mRecycledLocation; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRecycled; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MotionEvent() { 2270dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn mPointerIdentifiers = new int[BASE_AVAIL_POINTERS]; 2289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mDataSamples = new float[BASE_AVAIL_POINTERS*BASE_AVAIL_SAMPLES*NUM_SAMPLE_DATA]; 2299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mTimeSamples = new long[BASE_AVAIL_SAMPLES]; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 231cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private MotionEvent obtain() { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (gRecyclerLock) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gRecyclerTop == null) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new MotionEvent(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MotionEvent ev = gRecyclerTop; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gRecyclerTop = ev.mNext; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gRecyclerUsed--; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mRecycledLocation = null; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mRecycled = false; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ev; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan 24653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan /** 24753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * Create a new MotionEvent, filling in all of the basic values that 24853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * define the motion. 24953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * 25053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param downTime The time (in ms) when the user originally pressed down to start 25153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 25253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param eventTime The the time (in ms) when this specific event was generated. This 25353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * must be obtained from {@link SystemClock#uptimeMillis()}. 25453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param eventTimeNano The the time (in ns) when this specific event was generated. This 25553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * must be obtained from {@link System#nanoTime()}. 25653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param action The kind of action being performed -- one of either 25753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or 25853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * {@link #ACTION_CANCEL}. 2590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointers The number of points that will be in this event. 2600dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param inPointerIds An array of <em>pointers</em> values providing 2610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * an identifier for each pointer. 2620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param inData An array of <em>pointers*NUM_SAMPLE_DATA</em> of initial 2630dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * data samples for the event. 26453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param metaState The state of any meta / modifier keys that were in effect when 26553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * the event was generated. 26653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param xPrecision The precision of the X coordinate being reported. 26753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param yPrecision The precision of the Y coordinate being reported. 26853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param deviceId The id for the device that this event came from. An id of 26953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * zero indicates that the event didn't come from a physical device; other 27053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * numbers are arbitrary and you shouldn't depend on the values. 27153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @param edgeFlags A bitfield indicating which edges, if any, where touched by this 27253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * MotionEvent. 27353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * 27453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @hide 27553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan */ 27653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan static public MotionEvent obtainNano(long downTime, long eventTime, long eventTimeNano, 2770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn int action, int pointers, int[] inPointerIds, float[] inData, int metaState, 27853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan float xPrecision, float yPrecision, int deviceId, int edgeFlags) { 27953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan MotionEvent ev = obtain(); 28053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mDeviceId = deviceId; 28153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mEdgeFlags = edgeFlags; 28253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mDownTime = downTime; 28353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mEventTimeNano = eventTimeNano; 28453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mAction = action; 28553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mMetaState = metaState; 286ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn ev.mRawX = inData[SAMPLE_X]; 287ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn ev.mRawY = inData[SAMPLE_Y]; 28853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mXPrecision = xPrecision; 28953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mYPrecision = yPrecision; 2909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumPointers = pointers; 2919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumSamples = 1; 2929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 2930dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn System.arraycopy(inPointerIds, 0, ev.mPointerIdentifiers, 0, pointers); 2940dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn System.arraycopy(inData, 0, ev.mDataSamples, 0, pointers * NUM_SAMPLE_DATA); 2959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mTimeSamples[0] = eventTime; 29653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan 2970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (DEBUG_POINTERS) { 2980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn StringBuilder sb = new StringBuilder(128); 2990dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append("New:"); 3000dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn for (int i=0; i<pointers; i++) { 3010dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(" #"); 3020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(ev.mPointerIdentifiers[i]); 3030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append("("); 3040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(ev.mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_X]); 3050dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(","); 3060dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(ev.mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_Y]); 3070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(")"); 3080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 3090dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn Log.v("MotionEvent", sb.toString()); 3100dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 3110dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn 31253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan return ev; 31353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new MotionEvent, filling in all of the basic values that 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * define the motion. 318cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 319cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * @param downTime The time (in ms) when the user originally pressed down to start 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 321cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * @param eventTime The the time (in ms) when this specific event was generated. This 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be obtained from {@link SystemClock#uptimeMillis()}. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param action The kind of action being performed -- one of either 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ACTION_CANCEL}. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The X coordinate of this event. 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The Y coordinate of this event. 328cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * @param pressure The current pressure of this event. The pressure generally 329cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * ranges from 0 (no pressure at all) to 1 (normal pressure), however 330cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * values higher than 1 may be generated depending on the calibration of 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the input device. 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size A scaled value of the approximate size of the area being pressed when 333cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * touched with the finger. The actual value in pixels corresponding to the finger 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * touch is normalized with a device specific range of values 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and scaled to a value between 0 and 1. 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param metaState The state of any meta / modifier keys that were in effect when 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the event was generated. 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param xPrecision The precision of the X coordinate being reported. 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param yPrecision The precision of the Y coordinate being reported. 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param deviceId The id for the device that this event came from. An id of 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero indicates that the event didn't come from a physical device; other 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * numbers are arbitrary and you shouldn't depend on the values. 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param edgeFlags A bitfield indicating which edges, if any, where touched by this 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MotionEvent. 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public MotionEvent obtain(long downTime, long eventTime, int action, 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x, float y, float pressure, float size, int metaState, 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float xPrecision, float yPrecision, int deviceId, int edgeFlags) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MotionEvent ev = obtain(); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mDeviceId = deviceId; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mEdgeFlags = edgeFlags; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mDownTime = downTime; 35353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mEventTimeNano = eventTime * 1000000; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mAction = action; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mMetaState = metaState; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mXPrecision = xPrecision; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mYPrecision = yPrecision; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumPointers = 1; 3609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumSamples = 1; 3610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn int[] pointerIds = ev.mPointerIdentifiers; 3620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn pointerIds[0] = 0; 3639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] data = ev.mDataSamples; 3649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_X] = ev.mRawX = x; 3659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_Y] = ev.mRawY = y; 3669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_PRESSURE] = pressure; 3679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_SIZE] = size; 3689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mTimeSamples[0] = eventTime; 3699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 3709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return ev; 3719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 3729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 3739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 3749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Create a new MotionEvent, filling in all of the basic values that 3759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * define the motion. 3769822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * 3779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param downTime The time (in ms) when the user originally pressed down to start 3789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 3799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param eventTime The the time (in ms) when this specific event was generated. This 3809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * must be obtained from {@link SystemClock#uptimeMillis()}. 3819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param action The kind of action being performed -- one of either 3829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or 3839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * {@link #ACTION_CANCEL}. 3849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param pointers The number of pointers that are active in this event. 3859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param x The X coordinate of this event. 3869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param y The Y coordinate of this event. 3879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param pressure The current pressure of this event. The pressure generally 3889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * ranges from 0 (no pressure at all) to 1 (normal pressure), however 3899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * values higher than 1 may be generated depending on the calibration of 3909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * the input device. 3919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param size A scaled value of the approximate size of the area being pressed when 3929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * touched with the finger. The actual value in pixels corresponding to the finger 3939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * touch is normalized with a device specific range of values 3949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * and scaled to a value between 0 and 1. 3959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param metaState The state of any meta / modifier keys that were in effect when 3969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * the event was generated. 3979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param xPrecision The precision of the X coordinate being reported. 3989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param yPrecision The precision of the Y coordinate being reported. 3999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param deviceId The id for the device that this event came from. An id of 4009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * zero indicates that the event didn't come from a physical device; other 4019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * numbers are arbitrary and you shouldn't depend on the values. 4029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param edgeFlags A bitfield indicating which edges, if any, where touched by this 4039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * MotionEvent. 4049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 4059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn static public MotionEvent obtain(long downTime, long eventTime, int action, 4069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn int pointers, float x, float y, float pressure, float size, int metaState, 4079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float xPrecision, float yPrecision, int deviceId, int edgeFlags) { 4089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn MotionEvent ev = obtain(); 4099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mDeviceId = deviceId; 4109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mEdgeFlags = edgeFlags; 4119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mDownTime = downTime; 4129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mEventTimeNano = eventTime * 1000000; 4139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mAction = action; 4149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumPointers = pointers; 4159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mMetaState = metaState; 4169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mXPrecision = xPrecision; 4179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mYPrecision = yPrecision; 4189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 4199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumPointers = 1; 4209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumSamples = 1; 4210dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn int[] pointerIds = ev.mPointerIdentifiers; 4220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn pointerIds[0] = 0; 4239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] data = ev.mDataSamples; 4249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_X] = ev.mRawX = x; 4259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_Y] = ev.mRawY = y; 4269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_PRESSURE] = pressure; 4279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_SIZE] = size; 4289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mTimeSamples[0] = eventTime; 4299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ev; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 432cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new MotionEvent, filling in a subset of the basic motion 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values. Those not specified here are: device id (always 0), pressure 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and size (always 1), x and y precision (always 1), and edgeFlags (always 0). 437cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 438cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * @param downTime The time (in ms) when the user originally pressed down to start 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 440cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * @param eventTime The the time (in ms) when this specific event was generated. This 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be obtained from {@link SystemClock#uptimeMillis()}. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param action The kind of action being performed -- one of either 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ACTION_CANCEL}. 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The X coordinate of this event. 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The Y coordinate of this event. 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param metaState The state of any meta / modifier keys that were in effect when 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the event was generated. 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public MotionEvent obtain(long downTime, long eventTime, int action, 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x, float y, int metaState) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MotionEvent ev = obtain(); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mDeviceId = 0; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mEdgeFlags = 0; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mDownTime = downTime; 45653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mEventTimeNano = eventTime * 1000000; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mAction = action; 4589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumPointers = 1; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mMetaState = metaState; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mXPrecision = 1.0f; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mYPrecision = 1.0f; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumPointers = 1; 4649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumSamples = 1; 4650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn int[] pointerIds = ev.mPointerIdentifiers; 4660dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn pointerIds[0] = 0; 4679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] data = ev.mDataSamples; 4689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_X] = ev.mRawX = x; 4699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_Y] = ev.mRawY = y; 4709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_PRESSURE] = 1.0f; 4719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_SIZE] = 1.0f; 4729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mTimeSamples[0] = eventTime; 4739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ev; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4768169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima 4778169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima /** 47864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima * Scales down the coordination of this event by the given scale. 4798169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima * 4808169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima * @hide 4818169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima */ 4828169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima public void scale(float scale) { 48364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mRawX *= scale; 48464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mRawY *= scale; 48564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mXPrecision *= scale; 48664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mYPrecision *= scale; 4879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] history = mDataSamples; 4889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int length = mNumPointers * mNumSamples * NUM_SAMPLE_DATA; 4899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn for (int i = 0; i < length; i += NUM_SAMPLE_DATA) { 4909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn history[i + SAMPLE_X] *= scale; 4919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn history[i + SAMPLE_Y] *= scale; 4929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn // no need to scale pressure 4939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn history[i + SAMPLE_SIZE] *= scale; // TODO: square this? 4948169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima } 4958169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima } 4968169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new MotionEvent, copying from an existing one. 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public MotionEvent obtain(MotionEvent o) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MotionEvent ev = obtain(); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mDeviceId = o.mDeviceId; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mEdgeFlags = o.mEdgeFlags; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mDownTime = o.mDownTime; 50553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan ev.mEventTimeNano = o.mEventTimeNano; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mAction = o.mAction; 5079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mNumPointers = o.mNumPointers; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mRawX = o.mRawX; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mRawY = o.mRawY; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mMetaState = o.mMetaState; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mXPrecision = o.mXPrecision; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.mYPrecision = o.mYPrecision; 5139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 5140dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn final int NS = ev.mNumSamples = o.mNumSamples; 5150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (ev.mTimeSamples.length >= NS) { 5160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn System.arraycopy(o.mTimeSamples, 0, ev.mTimeSamples, 0, NS); 5179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } else { 5189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mTimeSamples = (long[])o.mTimeSamples.clone(); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 5210dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn final int NP = (ev.mNumPointers=o.mNumPointers); 5220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (ev.mPointerIdentifiers.length >= NP) { 5230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn System.arraycopy(o.mPointerIdentifiers, 0, ev.mPointerIdentifiers, 0, NP); 5249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } else { 5250dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn ev.mPointerIdentifiers = (int[])o.mPointerIdentifiers.clone(); 5269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 5279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 5280dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn final int ND = NP * NS * NUM_SAMPLE_DATA; 52918a081e68441a098fe0a1a6283439913cfb6b0caOwen Lin if (ev.mDataSamples.length >= ND) { 5309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn System.arraycopy(o.mDataSamples, 0, ev.mDataSamples, 0, ND); 5319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } else { 5329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn ev.mDataSamples = (float[])o.mDataSamples.clone(); 5339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 5349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ev; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 537cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recycle the MotionEvent, to be re-used by a later caller. After calling 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this function you must not ever touch the event again. 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void recycle() { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ensure recycle is only called once! 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TRACK_RECYCLED_LOCATION) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRecycledLocation != null) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecycledLocation = new RuntimeException("Last recycled here"); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mRecycled) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(toString() + " recycled twice!"); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.w("MotionEvent", "Recycling event " + this, mRecycledLocation); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (gRecyclerLock) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gRecyclerUsed < MAX_RECYCLED) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gRecyclerUsed++; 5579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mNumSamples = 0; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNext = gRecyclerTop; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gRecyclerTop = this; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 563cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the kind of action being performed -- one of either 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ACTION_CANCEL}. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getAction() { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAction; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 574cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * Returns the time (in ms) when the user originally pressed down to start 575cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * a stream of position events. 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final long getDownTime() { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDownTime; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the time (in ms) when this specific event was generated. 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final long getEventTime() { 5859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mTimeSamples[0]; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 58953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * Returns the time (in ns) when this specific event was generated. 59053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * The value is in nanosecond precision but it may not have nanosecond accuracy. 59153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * 59253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan * @hide 59353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan */ 59453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan public final long getEventTimeNano() { 59553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan return mEventTimeNano; 59653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan } 59753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan 59853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan /** 5990dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getX(int)} for the first pointer index (may be an 6000dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * arbitrary pointer identifier). 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float getX() { 6039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[SAMPLE_X]; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getY(int)} for the first pointer index (may be an 6080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * arbitrary pointer identifier). 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float getY() { 6119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[SAMPLE_Y]; 6129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 6139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 6149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 6150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getPressure(int)} for the first pointer index (may be an 6160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * arbitrary pointer identifier). 6179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 6189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public final float getPressure() { 6199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[SAMPLE_PRESSURE]; 6209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 6219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 6229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 6230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getSize(int)} for the first pointer index (may be an 6240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * arbitrary pointer identifier). 6259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 6269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public final float getSize() { 6279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[SAMPLE_SIZE]; 6289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 6299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 6309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 6310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * The number of pointers of data contained in this event. Always 6320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * >= 1. 6330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn */ 6340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final int getPointerCount() { 6350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn return mNumPointers; 6360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 6370dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn 6380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn /** 6390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Return the pointer identifier associated with a particular pointer 6400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * data index is this event. The identifier tells you the actual pointer 6410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * number associated with the data, accounting for individual pointers 6420dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * going up and down since the start of the current gesture. 6430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 6440dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 6450dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn */ 646d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn public final int getPointerId(int pointerIndex) { 647d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn return mPointerIdentifiers[pointerIndex]; 6480dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 6490dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn 6500dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn /** 6510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Given a pointer identifier, find the index of its data in the event. 6520dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * 6530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerId The identifier of the pointer to be found. 6540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @return Returns either the index of the pointer (for use with 6550dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getX(int) et al.), or -1 if there is no data available for 6560dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * that pointer identifier. 6570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn */ 6580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final int findPointerIndex(int pointerId) { 6590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn int i = mNumPointers; 6600dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn while (i > 0) { 6610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn i--; 6620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (mPointerIdentifiers[i] == pointerId) { 6630dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn return i; 6640dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 6650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 6660dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn return -1; 6670dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 6680dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn 6690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn /** 6700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Returns the X coordinate of this event for the given pointer 6710dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 6720dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * identifier for this index). 6739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Whole numbers are pixels; the 6749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * value may have a fraction for input devices that are sub-pixel precise. 6750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 6760dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 6779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 6780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final float getX(int pointerIndex) { 6790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_X]; 6809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 6819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 6829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 6830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Returns the Y coordinate of this event for the given pointer 6840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 6850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * identifier for this index). 6869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Whole numbers are pixels; the 6879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * value may have a fraction for input devices that are sub-pixel precise. 6880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 6890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 6909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 6910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final float getY(int pointerIndex) { 6920dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_Y]; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6960dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Returns the current pressure of this event for the given pointer 6970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 6980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * identifier for this index). 6999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * The pressure generally 700cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * ranges from 0 (no pressure at all) to 1 (normal pressure), however 701cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * values higher than 1 may be generated depending on the calibration of 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the input device. 7030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 7040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7060dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final float getPressure(int pointerIndex) { 7070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_PRESSURE]; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7110dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Returns a scaled value of the approximate size for the given pointer 7120dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 7130dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * identifier for this index). 7140dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * This represents some approximation of the area of the screen being 7150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * pressed; the actual value in pixels corresponding to the 7169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * touch is normalized with the device specific range of values 717cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * and scaled to a value between 0 and 1. The value of size can be used to 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * determine fat touch events. 7190dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 7200dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final float getSize(int pointerIndex) { 7230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_SIZE]; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the state of any meta / modifier keys that were in effect when 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the event was generated. This is the same values as those 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned by {@link KeyEvent#getMetaState() KeyEvent.getMetaState}. 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return an integer in which each bit set to 1 represents a pressed 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * meta key 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see KeyEvent#getMetaState() 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getMetaState() { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMetaState; 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the original raw X coordinate of this event. For touch 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events on the screen, this is the original location of the event 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the screen, before it had been adjusted for the containing window 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and views. 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float getRawX() { 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRawX; 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the original raw Y coordinate of this event. For touch 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events on the screen, this is the original location of the event 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the screen, before it had been adjusted for the containing window 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and views. 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float getRawY() { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRawY; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the precision of the X coordinates being reported. You can 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * multiple this number with {@link #getX} to find the actual hardware 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value of the X coordinate. 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the precision of X coordinates being reported. 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float getXPrecision() { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mXPrecision; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the precision of the Y coordinates being reported. You can 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * multiple this number with {@link #getY} to find the actual hardware 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value of the Y coordinate. 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the precision of Y coordinates being reported. 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float getYPrecision() { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mYPrecision; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of historical points in this event. These are 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * movements that have occurred between this event and the previous event. 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This only applies to ACTION_MOVE events -- all other actions will have 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a size of 0. 785cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the number of historical points in the event. 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getHistorySize() { 7899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mNumSamples - 1; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 791cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the time that a historical movement occurred between this event 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the previous event. Only applies to ACTION_MOVE events. 795cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos Which historical value to return; must be less than 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getHistorySize} 798cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getHistorySize 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getEventTime 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final long getHistoricalEventTime(int pos) { 8039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mTimeSamples[pos + 1]; 8049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 8059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 8069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 8070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getHistoricalX(int)} for the first pointer index (may be an 8080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * arbitrary pointer identifier). 8099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 8109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public final float getHistoricalX(int pos) { 8119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_X]; 8129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 8139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 8149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 8150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getHistoricalY(int)} for the first pointer index (may be an 8160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * arbitrary pointer identifier). 8179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 8189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public final float getHistoricalY(int pos) { 8199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_Y]; 8209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 8219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 8229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 8230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getHistoricalPressure(int)} for the first pointer index (may be an 8240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * arbitrary pointer identifier). 8259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 8269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public final float getHistoricalPressure(int pos) { 8279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_PRESSURE]; 8289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 8299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 8309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 8310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * {@link #getHistoricalSize(int)} for the first pointer index (may be an 8320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * arbitrary pointer identifier). 8339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 8349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public final float getHistoricalSize(int pos) { 8359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_SIZE]; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 837cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Returns a historical X coordinate, as per {@link #getX(int)}, that 8400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * occurred between this event and the previous event for the given pointer. 8410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Only applies to ACTION_MOVE events. 842cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 8430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 8440dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos Which historical value to return; must be less than 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getHistorySize} 847cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getHistorySize 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getX 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final float getHistoricalX(int pointerIndex, int pos) { 8529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) 8530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_X]; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 855cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Returns a historical Y coordinate, as per {@link #getY(int)}, that 8580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * occurred between this event and the previous event for the given pointer. 8590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Only applies to ACTION_MOVE events. 860cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 8610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 8620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos Which historical value to return; must be less than 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getHistorySize} 865cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getHistorySize 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getY 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final float getHistoricalY(int pointerIndex, int pos) { 8709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) 8710dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_Y]; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 873cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Returns a historical pressure coordinate, as per {@link #getPressure(int)}, 8760dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * that occurred between this event and the previous event for the given 8770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * pointer. Only applies to ACTION_MOVE events. 878cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 8790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 8800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos Which historical value to return; must be less than 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getHistorySize} 8830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getHistorySize 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getPressure 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final float getHistoricalPressure(int pointerIndex, int pos) { 8889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) 8890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_PRESSURE]; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 891cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8930dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Returns a historical size coordinate, as per {@link #getSize(int)}, that 8940dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * occurred between this event and the previous event for the given pointer. 8950dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * Only applies to ACTION_MOVE events. 896cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 8970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 8980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * (the first pointer that is down) to {@link #getPointerCount()}-1. 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos Which historical value to return; must be less than 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getHistorySize} 9010dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn * 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getHistorySize 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSize 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9050dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn public final float getHistoricalSize(int pointerIndex, int pos) { 9069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) 9070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_SIZE]; 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the id for the device that this event came from. An id of 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero indicates that the event didn't come from a physical device; other 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * numbers are arbitrary and you shouldn't depend on the values. 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getDeviceId() { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDeviceId; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 918cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a bitfield indicating which edges, if any, where touched by this 921cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * MotionEvent. For touch events, clients can use this to determine if the 922cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * user's finger was touching the edge of the display. 923cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EDGE_LEFT 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EDGE_TOP 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EDGE_RIGHT 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EDGE_BOTTOM 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getEdgeFlags() { 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mEdgeFlags; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 932cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the bitfield indicating which edges, if any, where touched by this 936cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * MotionEvent. 937cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getEdgeFlags() 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setEdgeFlags(int flags) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEdgeFlags = flags; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets this event's action. 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setAction(int action) { 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAction = action; 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adjust this event's location. 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param deltaX Amount to add to the current X coordinate of the event. 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param deltaY Amount to add to the current Y coordinate of the event. 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void offsetLocation(float deltaX, float deltaY) { 9579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int N = mNumPointers*mNumSamples*4; 9589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final float[] pos = mDataSamples; 9599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn for (int i=0; i<N; i+=NUM_SAMPLE_DATA) { 9609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn pos[i+SAMPLE_X] += deltaX; 9619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn pos[i+SAMPLE_Y] += deltaY; 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 964cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this event's location. Applies {@link #offsetLocation} with a 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * delta from the current location to the given new location. 968cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x New absolute X location. 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y New absolute Y location. 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setLocation(float x, float y) { 9739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float deltaX = x-mDataSamples[SAMPLE_X]; 9749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float deltaY = y-mDataSamples[SAMPLE_Y]; 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (deltaX != 0 || deltaY != 0) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsetLocation(deltaX, deltaY); 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new movement to the batch of movements in this event. The event's 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current location, position and size is updated to the new values. In 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the future, the current values in the event will be added to a list of 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * historic values. 985cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy * 9869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param eventTime The time stamp for this data. 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The new X position. 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The new Y position. 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pressure The new pressure. 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size The new size. 9919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param metaState Meta key state. 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void addBatch(long eventTime, float x, float y, 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float pressure, float size, int metaState) { 9959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] data = mDataSamples; 9969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn long[] times = mTimeSamples; 9979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 9989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NP = mNumPointers; 9999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NS = mNumSamples; 10009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NI = NP*NS; 10019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int ND = NI * NUM_SAMPLE_DATA; 10020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (data.length <= ND) { 10030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn final int NEW_ND = ND + (NP * (BASE_AVAIL_SAMPLES * NUM_SAMPLE_DATA)); 10049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] newData = new float[NEW_ND]; 10059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn System.arraycopy(data, 0, newData, 0, ND); 10069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mDataSamples = data = newData; 10079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 10089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn if (times.length <= NS) { 10099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NEW_NS = NS + BASE_AVAIL_SAMPLES; 10109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn long[] newHistoryTimes = new long[NEW_NS]; 10119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn System.arraycopy(times, 0, newHistoryTimes, 0, NS); 10129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mTimeSamples = times = newHistoryTimes; 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 10159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn times[NS] = times[0]; 10169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn times[0] = eventTime; 10179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 10189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int pos = NS*NUM_SAMPLE_DATA; 10199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[pos+SAMPLE_X] = data[SAMPLE_X]; 10209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[pos+SAMPLE_Y] = data[SAMPLE_Y]; 10219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[pos+SAMPLE_PRESSURE] = data[SAMPLE_PRESSURE]; 10229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[pos+SAMPLE_SIZE] = data[SAMPLE_SIZE]; 10239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_X] = x; 10249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_Y] = y; 10259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_PRESSURE] = pressure; 10269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn data[SAMPLE_SIZE] = size; 10279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mNumSamples = NS+1; 1028cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 10299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mRawX = x; 10309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mRawY = y; 10319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mMetaState |= metaState; 10329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 1033cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 10349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn /** 10359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * Add a new movement to the batch of movements in this event. The 10369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * input data must contain (NUM_SAMPLE_DATA * {@link #getPointerCount()}) 10379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * samples of data. 10389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * 10399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param eventTime The time stamp for this data. 10409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param inData The actual data. 10419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @param metaState Meta key state. 10429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * 10439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn * @hide 10449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn */ 10459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn public final void addBatch(long eventTime, float[] inData, int metaState) { 10469822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] data = mDataSamples; 10479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn long[] times = mTimeSamples; 10489822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 10499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NP = mNumPointers; 10509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NS = mNumSamples; 10519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NI = NP*NS; 10529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int ND = NI * NUM_SAMPLE_DATA; 10530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (data.length <= ND) { 10540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn final int NEW_ND = ND + (NP * (BASE_AVAIL_SAMPLES * NUM_SAMPLE_DATA)); 10559822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] newData = new float[NEW_ND]; 10569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn System.arraycopy(data, 0, newData, 0, ND); 10579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mDataSamples = data = newData; 10589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 10599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn if (times.length <= NS) { 10609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NEW_NS = NS + BASE_AVAIL_SAMPLES; 10619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn long[] newHistoryTimes = new long[NEW_NS]; 10629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn System.arraycopy(times, 0, newHistoryTimes, 0, NS); 10639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mTimeSamples = times = newHistoryTimes; 10649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 10659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 10669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn times[NS] = times[0]; 10679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn times[0] = eventTime; 10689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 10699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn System.arraycopy(data, 0, data, ND, mNumPointers*NUM_SAMPLE_DATA); 10709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn System.arraycopy(inData, 0, data, 0, mNumPointers*NUM_SAMPLE_DATA); 10719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn 10729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mNumSamples = NS+1; 1073cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 10749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mRawX = inData[SAMPLE_X]; 10759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mRawY = inData[SAMPLE_Y]; 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMetaState |= metaState; 10770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn 10780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (DEBUG_POINTERS) { 10790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn StringBuilder sb = new StringBuilder(128); 10800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append("Add:"); 10810dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn for (int i=0; i<mNumPointers; i++) { 10820dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(" #"); 10830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(mPointerIdentifiers[i]); 10840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append("("); 10850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_X]); 10860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(","); 10870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_Y]); 10880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn sb.append(")"); 10890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 10900dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn Log.v("MotionEvent", sb.toString()); 10910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1093cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "MotionEvent{" + Integer.toHexString(System.identityHashCode(this)) 10979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn + " action=" + mAction + " x=" + getX() 10989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn + " y=" + getY() + " pressure=" + getPressure() + " size=" + getSize() + "}"; 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<MotionEvent> CREATOR 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<MotionEvent>() { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MotionEvent createFromParcel(Parcel in) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MotionEvent ev = obtain(); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.readFromParcel(in); 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ev; 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MotionEvent[] newArray(int size) { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new MotionEvent[size]; 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mDownTime); 112053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan out.writeLong(mEventTimeNano); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mAction); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mMetaState); 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeFloat(mRawX); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeFloat(mRawY); 11259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NP = mNumPointers; 11269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn out.writeInt(NP); 11279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NS = mNumSamples; 11289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn out.writeInt(NS); 11299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NI = NP*NS; 11309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn if (NI > 0) { 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 11320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn int[] state = mPointerIdentifiers; 11330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn for (i=0; i<NP; i++) { 11349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn out.writeInt(state[i]); 11359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 11360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn final int ND = NI*NUM_SAMPLE_DATA; 11379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] history = mDataSamples; 11380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn for (i=0; i<ND; i++) { 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeFloat(history[i]); 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn long[] times = mTimeSamples; 11429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn for (i=0; i<NS; i++) { 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(times[i]); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeFloat(mXPrecision); 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeFloat(mYPrecision); 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mDeviceId); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mEdgeFlags); 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readFromParcel(Parcel in) { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDownTime = in.readLong(); 115453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan mEventTimeNano = in.readLong(); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAction = in.readInt(); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMetaState = in.readInt(); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawX = in.readFloat(); 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawY = in.readFloat(); 11599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NP = in.readInt(); 11609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mNumPointers = NP; 11619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NS = in.readInt(); 11629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mNumSamples = NS; 11639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn final int NI = NP*NS; 11649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn if (NI > 0) { 11650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn int[] ids = mPointerIdentifiers; 11660dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (ids.length < NP) { 11670dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn mPointerIdentifiers = ids = new int[NP]; 11689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 11690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn for (int i=0; i<NP; i++) { 11700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn ids[i] = in.readInt(); 11719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn } 11729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn float[] history = mDataSamples; 11730dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn final int ND = NI*NUM_SAMPLE_DATA; 11740dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn if (history.length < ND) { 11750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn mDataSamples = history = new float[ND]; 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn for (int i=0; i<ND; i++) { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project history[i] = in.readFloat(); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn long[] times = mTimeSamples; 11819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn if (times == null || times.length < NS) { 11829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn mTimeSamples = times = new long[NS]; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn for (int i=0; i<NS; i++) { 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project times[i] = in.readLong(); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mXPrecision = in.readFloat(); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mYPrecision = in.readFloat(); 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDeviceId = in.readInt(); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEdgeFlags = in.readInt(); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1195