1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.view; 18 19 import android.graphics.Matrix; 20 import android.os.Parcel; 21 import android.os.Parcelable; 22 import android.os.SystemClock; 23 import android.util.SparseArray; 24 25 /** 26 * Object used to report movement (mouse, pen, finger, trackball) events. 27 * Motion events may hold either absolute or relative movements and other data, 28 * depending on the type of device. 29 * 30 * <h3>Overview</h3> 31 * <p> 32 * Motion events describe movements in terms of an action code and a set of axis values. 33 * The action code specifies the state change that occurred such as a pointer going 34 * down or up. The axis values describe the position and other movement properties. 35 * </p><p> 36 * For example, when the user first touches the screen, the system delivers a touch 37 * event to the appropriate {@link View} with the action code {@link #ACTION_DOWN} 38 * and a set of axis values that include the X and Y coordinates of the touch and 39 * information about the pressure, size and orientation of the contact area. 40 * </p><p> 41 * Some devices can report multiple movement traces at the same time. Multi-touch 42 * screens emit one movement trace for each finger. The individual fingers or 43 * other objects that generate movement traces are referred to as <em>pointers</em>. 44 * Motion events contain information about all of the pointers that are currently active 45 * even if some of them have not moved since the last event was delivered. 46 * </p><p> 47 * The number of pointers only ever changes by one as individual pointers go up and down, 48 * except when the gesture is canceled. 49 * </p><p> 50 * Each pointer has a unique id that is assigned when it first goes down 51 * (indicated by {@link #ACTION_DOWN} or {@link #ACTION_POINTER_DOWN}). A pointer id 52 * remains valid until the pointer eventually goes up (indicated by {@link #ACTION_UP} 53 * or {@link #ACTION_POINTER_UP}) or when the gesture is canceled (indicated by 54 * {@link #ACTION_CANCEL}). 55 * </p><p> 56 * The MotionEvent class provides many methods to query the position and other properties of 57 * pointers, such as {@link #getX(int)}, {@link #getY(int)}, {@link #getAxisValue}, 58 * {@link #getPointerId(int)}, {@link #getToolType(int)}, and many others. Most of these 59 * methods accept the pointer index as a parameter rather than the pointer id. 60 * The pointer index of each pointer in the event ranges from 0 to one less than the value 61 * returned by {@link #getPointerCount()}. 62 * </p><p> 63 * The order in which individual pointers appear within a motion event is undefined. 64 * Thus the pointer index of a pointer can change from one event to the next but 65 * the pointer id of a pointer is guaranteed to remain constant as long as the pointer 66 * remains active. Use the {@link #getPointerId(int)} method to obtain the 67 * pointer id of a pointer to track it across all subsequent motion events in a gesture. 68 * Then for successive motion events, use the {@link #findPointerIndex(int)} method 69 * to obtain the pointer index for a given pointer id in that motion event. 70 * </p><p> 71 * Mouse and stylus buttons can be retrieved using {@link #getButtonState()}. It is a 72 * good idea to check the button state while handling {@link #ACTION_DOWN} as part 73 * of a touch event. The application may choose to perform some different action 74 * if the touch event starts due to a secondary button click, such as presenting a 75 * context menu. 76 * </p> 77 * 78 * <h3>Batching</h3> 79 * <p> 80 * For efficiency, motion events with {@link #ACTION_MOVE} may batch together 81 * multiple movement samples within a single object. The most current 82 * pointer coordinates are available using {@link #getX(int)} and {@link #getY(int)}. 83 * Earlier coordinates within the batch are accessed using {@link #getHistoricalX(int, int)} 84 * and {@link #getHistoricalY(int, int)}. The coordinates are "historical" only 85 * insofar as they are older than the current coordinates in the batch; however, 86 * they are still distinct from any other coordinates reported in prior motion events. 87 * To process all coordinates in the batch in time order, first consume the historical 88 * coordinates then consume the current coordinates. 89 * </p><p> 90 * Example: Consuming all samples for all pointers in a motion event in time order. 91 * </p><p><pre><code> 92 * void printSamples(MotionEvent ev) { 93 * final int historySize = ev.getHistorySize(); 94 * final int pointerCount = ev.getPointerCount(); 95 * for (int h = 0; h < historySize; h++) { 96 * System.out.printf("At time %d:", ev.getHistoricalEventTime(h)); 97 * for (int p = 0; p < pointerCount; p++) { 98 * System.out.printf(" pointer %d: (%f,%f)", 99 * ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h)); 100 * } 101 * } 102 * System.out.printf("At time %d:", ev.getEventTime()); 103 * for (int p = 0; p < pointerCount; p++) { 104 * System.out.printf(" pointer %d: (%f,%f)", 105 * ev.getPointerId(p), ev.getX(p), ev.getY(p)); 106 * } 107 * } 108 * </code></pre></p> 109 * 110 * <h3>Device Types</h3> 111 * <p> 112 * The interpretation of the contents of a MotionEvent varies significantly depending 113 * on the source class of the device. 114 * </p><p> 115 * On pointing devices with source class {@link InputDevice#SOURCE_CLASS_POINTER} 116 * such as touch screens, the pointer coordinates specify absolute 117 * positions such as view X/Y coordinates. Each complete gesture is represented 118 * by a sequence of motion events with actions that describe pointer state transitions 119 * and movements. A gesture starts with a motion event with {@link #ACTION_DOWN} 120 * that provides the location of the first pointer down. As each additional 121 * pointer that goes down or up, the framework will generate a motion event with 122 * {@link #ACTION_POINTER_DOWN} or {@link #ACTION_POINTER_UP} accordingly. 123 * Pointer movements are described by motion events with {@link #ACTION_MOVE}. 124 * Finally, a gesture end either when the final pointer goes up as represented 125 * by a motion event with {@link #ACTION_UP} or when gesture is canceled 126 * with {@link #ACTION_CANCEL}. 127 * </p><p> 128 * Some pointing devices such as mice may support vertical and/or horizontal scrolling. 129 * A scroll event is reported as a generic motion event with {@link #ACTION_SCROLL} that 130 * includes the relative scroll offset in the {@link #AXIS_VSCROLL} and 131 * {@link #AXIS_HSCROLL} axes. See {@link #getAxisValue(int)} for information 132 * about retrieving these additional axes. 133 * </p><p> 134 * On trackball devices with source class {@link InputDevice#SOURCE_CLASS_TRACKBALL}, 135 * the pointer coordinates specify relative movements as X/Y deltas. 136 * A trackball gesture consists of a sequence of movements described by motion 137 * events with {@link #ACTION_MOVE} interspersed with occasional {@link #ACTION_DOWN} 138 * or {@link #ACTION_UP} motion events when the trackball button is pressed or released. 139 * </p><p> 140 * On joystick devices with source class {@link InputDevice#SOURCE_CLASS_JOYSTICK}, 141 * the pointer coordinates specify the absolute position of the joystick axes. 142 * The joystick axis values are normalized to a range of -1.0 to 1.0 where 0.0 corresponds 143 * to the center position. More information about the set of available axes and the 144 * range of motion can be obtained using {@link InputDevice#getMotionRange}. 145 * Some common joystick axes are {@link #AXIS_X}, {@link #AXIS_Y}, 146 * {@link #AXIS_HAT_X}, {@link #AXIS_HAT_Y}, {@link #AXIS_Z} and {@link #AXIS_RZ}. 147 * </p><p> 148 * Refer to {@link InputDevice} for more information about how different kinds of 149 * input devices and sources represent pointer coordinates. 150 * </p> 151 * 152 * <h3>Consistency Guarantees</h3> 153 * <p> 154 * Motion events are always delivered to views as a consistent stream of events. 155 * What constitutes a consistent stream varies depending on the type of device. 156 * For touch events, consistency implies that pointers go down one at a time, 157 * move around as a group and then go up one at a time or are canceled. 158 * </p><p> 159 * While the framework tries to deliver consistent streams of motion events to 160 * views, it cannot guarantee it. Some events may be dropped or modified by 161 * containing views in the application before they are delivered thereby making 162 * the stream of events inconsistent. Views should always be prepared to 163 * handle {@link #ACTION_CANCEL} and should tolerate anomalous 164 * situations such as receiving a new {@link #ACTION_DOWN} without first having 165 * received an {@link #ACTION_UP} for the prior gesture. 166 * </p> 167 */ 168 public final class MotionEvent extends InputEvent implements Parcelable { 169 private static final long NS_PER_MS = 1000000; 170 private static final String LABEL_PREFIX = "AXIS_"; 171 172 /** 173 * An invalid pointer id. 174 * 175 * This value (-1) can be used as a placeholder to indicate that a pointer id 176 * has not been assigned or is not available. It cannot appear as 177 * a pointer id inside a {@link MotionEvent}. 178 */ 179 public static final int INVALID_POINTER_ID = -1; 180 181 /** 182 * Bit mask of the parts of the action code that are the action itself. 183 */ 184 public static final int ACTION_MASK = 0xff; 185 186 /** 187 * Constant for {@link #getActionMasked}: A pressed gesture has started, the 188 * motion contains the initial starting location. 189 * <p> 190 * This is also a good time to check the button state to distinguish 191 * secondary and tertiary button clicks and handle them appropriately. 192 * Use {@link #getButtonState} to retrieve the button state. 193 * </p> 194 */ 195 public static final int ACTION_DOWN = 0; 196 197 /** 198 * Constant for {@link #getActionMasked}: A pressed gesture has finished, the 199 * motion contains the final release location as well as any intermediate 200 * points since the last down or move event. 201 */ 202 public static final int ACTION_UP = 1; 203 204 /** 205 * Constant for {@link #getActionMasked}: A change has happened during a 206 * press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}). 207 * The motion contains the most recent point, as well as any intermediate 208 * points since the last down or move event. 209 */ 210 public static final int ACTION_MOVE = 2; 211 212 /** 213 * Constant for {@link #getActionMasked}: The current gesture has been aborted. 214 * You will not receive any more points in it. You should treat this as 215 * an up event, but not perform any action that you normally would. 216 */ 217 public static final int ACTION_CANCEL = 3; 218 219 /** 220 * Constant for {@link #getActionMasked}: A movement has happened outside of the 221 * normal bounds of the UI element. This does not provide a full gesture, 222 * but only the initial location of the movement/touch. 223 */ 224 public static final int ACTION_OUTSIDE = 4; 225 226 /** 227 * Constant for {@link #getActionMasked}: A non-primary pointer has gone down. 228 * <p> 229 * Use {@link #getActionIndex} to retrieve the index of the pointer that changed. 230 * </p><p> 231 * The index is encoded in the {@link #ACTION_POINTER_INDEX_MASK} bits of the 232 * unmasked action returned by {@link #getAction}. 233 * </p> 234 */ 235 public static final int ACTION_POINTER_DOWN = 5; 236 237 /** 238 * Constant for {@link #getActionMasked}: A non-primary pointer has gone up. 239 * <p> 240 * Use {@link #getActionIndex} to retrieve the index of the pointer that changed. 241 * </p><p> 242 * The index is encoded in the {@link #ACTION_POINTER_INDEX_MASK} bits of the 243 * unmasked action returned by {@link #getAction}. 244 * </p> 245 */ 246 public static final int ACTION_POINTER_UP = 6; 247 248 /** 249 * Constant for {@link #getActionMasked}: A change happened but the pointer 250 * is not down (unlike {@link #ACTION_MOVE}). The motion contains the most 251 * recent point, as well as any intermediate points since the last 252 * hover move event. 253 * <p> 254 * This action is always delivered to the window or view under the pointer. 255 * </p><p> 256 * This action is not a touch event so it is delivered to 257 * {@link View#onGenericMotionEvent(MotionEvent)} rather than 258 * {@link View#onTouchEvent(MotionEvent)}. 259 * </p> 260 */ 261 public static final int ACTION_HOVER_MOVE = 7; 262 263 /** 264 * Constant for {@link #getActionMasked}: The motion event contains relative 265 * vertical and/or horizontal scroll offsets. Use {@link #getAxisValue(int)} 266 * to retrieve the information from {@link #AXIS_VSCROLL} and {@link #AXIS_HSCROLL}. 267 * The pointer may or may not be down when this event is dispatched. 268 * <p> 269 * This action is always delivered to the window or view under the pointer, which 270 * may not be the window or view currently touched. 271 * </p><p> 272 * This action is not a touch event so it is delivered to 273 * {@link View#onGenericMotionEvent(MotionEvent)} rather than 274 * {@link View#onTouchEvent(MotionEvent)}. 275 * </p> 276 */ 277 public static final int ACTION_SCROLL = 8; 278 279 /** 280 * Constant for {@link #getActionMasked}: The pointer is not down but has entered the 281 * boundaries of a window or view. 282 * <p> 283 * This action is always delivered to the window or view under the pointer. 284 * </p><p> 285 * This action is not a touch event so it is delivered to 286 * {@link View#onGenericMotionEvent(MotionEvent)} rather than 287 * {@link View#onTouchEvent(MotionEvent)}. 288 * </p> 289 */ 290 public static final int ACTION_HOVER_ENTER = 9; 291 292 /** 293 * Constant for {@link #getActionMasked}: The pointer is not down but has exited the 294 * boundaries of a window or view. 295 * <p> 296 * This action is always delivered to the window or view that was previously under the pointer. 297 * </p><p> 298 * This action is not a touch event so it is delivered to 299 * {@link View#onGenericMotionEvent(MotionEvent)} rather than 300 * {@link View#onTouchEvent(MotionEvent)}. 301 * </p> 302 */ 303 public static final int ACTION_HOVER_EXIT = 10; 304 305 /** 306 * Constant for {@link #getActionMasked}: A button has been pressed. 307 * 308 * <p> 309 * Use {@link #getActionButton()} to get which button was pressed. 310 * </p><p> 311 * This action is not a touch event so it is delivered to 312 * {@link View#onGenericMotionEvent(MotionEvent)} rather than 313 * {@link View#onTouchEvent(MotionEvent)}. 314 * </p> 315 */ 316 public static final int ACTION_BUTTON_PRESS = 11; 317 318 /** 319 * Constant for {@link #getActionMasked}: A button has been released. 320 * 321 * <p> 322 * Use {@link #getActionButton()} to get which button was released. 323 * </p><p> 324 * This action is not a touch event so it is delivered to 325 * {@link View#onGenericMotionEvent(MotionEvent)} rather than 326 * {@link View#onTouchEvent(MotionEvent)}. 327 * </p> 328 */ 329 public static final int ACTION_BUTTON_RELEASE = 12; 330 331 /** 332 * Bits in the action code that represent a pointer index, used with 333 * {@link #ACTION_POINTER_DOWN} and {@link #ACTION_POINTER_UP}. Shifting 334 * down by {@link #ACTION_POINTER_INDEX_SHIFT} provides the actual pointer 335 * index where the data for the pointer going up or down can be found; you can 336 * get its identifier with {@link #getPointerId(int)} and the actual 337 * data with {@link #getX(int)} etc. 338 * 339 * @see #getActionIndex 340 */ 341 public static final int ACTION_POINTER_INDEX_MASK = 0xff00; 342 343 /** 344 * Bit shift for the action bits holding the pointer index as 345 * defined by {@link #ACTION_POINTER_INDEX_MASK}. 346 * 347 * @see #getActionIndex 348 */ 349 public static final int ACTION_POINTER_INDEX_SHIFT = 8; 350 351 /** 352 * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the 353 * data index associated with {@link #ACTION_POINTER_DOWN}. 354 */ 355 @Deprecated 356 public static final int ACTION_POINTER_1_DOWN = ACTION_POINTER_DOWN | 0x0000; 357 358 /** 359 * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the 360 * data index associated with {@link #ACTION_POINTER_DOWN}. 361 */ 362 @Deprecated 363 public static final int ACTION_POINTER_2_DOWN = ACTION_POINTER_DOWN | 0x0100; 364 365 /** 366 * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the 367 * data index associated with {@link #ACTION_POINTER_DOWN}. 368 */ 369 @Deprecated 370 public static final int ACTION_POINTER_3_DOWN = ACTION_POINTER_DOWN | 0x0200; 371 372 /** 373 * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the 374 * data index associated with {@link #ACTION_POINTER_UP}. 375 */ 376 @Deprecated 377 public static final int ACTION_POINTER_1_UP = ACTION_POINTER_UP | 0x0000; 378 379 /** 380 * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the 381 * data index associated with {@link #ACTION_POINTER_UP}. 382 */ 383 @Deprecated 384 public static final int ACTION_POINTER_2_UP = ACTION_POINTER_UP | 0x0100; 385 386 /** 387 * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the 388 * data index associated with {@link #ACTION_POINTER_UP}. 389 */ 390 @Deprecated 391 public static final int ACTION_POINTER_3_UP = ACTION_POINTER_UP | 0x0200; 392 393 /** 394 * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_MASK} to match 395 * the actual data contained in these bits. 396 */ 397 @Deprecated 398 public static final int ACTION_POINTER_ID_MASK = 0xff00; 399 400 /** 401 * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_SHIFT} to match 402 * the actual data contained in these bits. 403 */ 404 @Deprecated 405 public static final int ACTION_POINTER_ID_SHIFT = 8; 406 407 /** 408 * This flag indicates that the window that received this motion event is partly 409 * or wholly obscured by another visible window above it. This flag is set to true 410 * even if the event did not directly pass through the obscured area. 411 * A security sensitive application can check this flag to identify situations in which 412 * a malicious application may have covered up part of its content for the purpose 413 * of misleading the user or hijacking touches. An appropriate response might be 414 * to drop the suspect touches or to take additional precautions to confirm the user's 415 * actual intent. 416 */ 417 public static final int FLAG_WINDOW_IS_OBSCURED = 0x1; 418 419 /** 420 * Private flag that indicates when the system has detected that this motion event 421 * may be inconsistent with respect to the sequence of previously delivered motion events, 422 * such as when a pointer move event is sent but the pointer is not down. 423 * 424 * @hide 425 * @see #isTainted 426 * @see #setTainted 427 */ 428 public static final int FLAG_TAINTED = 0x80000000; 429 430 /** 431 * Private flag indicating that this event was synthesized by the system and 432 * should be delivered to the accessibility focused view first. When being 433 * dispatched such an event is not handled by predecessors of the accessibility 434 * focused view and after the event reaches that view the flag is cleared and 435 * normal event dispatch is performed. This ensures that the platform can click 436 * on any view that has accessibility focus which is semantically equivalent to 437 * asking the view to perform a click accessibility action but more generic as 438 * views not implementing click action correctly can still be activated. 439 * 440 * @hide 441 * @see #isTargetAccessibilityFocus() 442 * @see #setTargetAccessibilityFocus(boolean) 443 */ 444 public static final int FLAG_TARGET_ACCESSIBILITY_FOCUS = 0x40000000; 445 446 447 /** 448 * Flag indicating the motion event intersected the top edge of the screen. 449 */ 450 public static final int EDGE_TOP = 0x00000001; 451 452 /** 453 * Flag indicating the motion event intersected the bottom edge of the screen. 454 */ 455 public static final int EDGE_BOTTOM = 0x00000002; 456 457 /** 458 * Flag indicating the motion event intersected the left edge of the screen. 459 */ 460 public static final int EDGE_LEFT = 0x00000004; 461 462 /** 463 * Flag indicating the motion event intersected the right edge of the screen. 464 */ 465 public static final int EDGE_RIGHT = 0x00000008; 466 467 /** 468 * Axis constant: X axis of a motion event. 469 * <p> 470 * <ul> 471 * <li>For a touch screen, reports the absolute X screen position of the center of 472 * the touch contact area. The units are display pixels. 473 * <li>For a touch pad, reports the absolute X surface position of the center of the touch 474 * contact area. The units are device-dependent; use {@link InputDevice#getMotionRange(int)} 475 * to query the effective range of values. 476 * <li>For a mouse, reports the absolute X screen position of the mouse pointer. 477 * The units are display pixels. 478 * <li>For a trackball, reports the relative horizontal displacement of the trackball. 479 * The value is normalized to a range from -1.0 (left) to 1.0 (right). 480 * <li>For a joystick, reports the absolute X position of the joystick. 481 * The value is normalized to a range from -1.0 (left) to 1.0 (right). 482 * </ul> 483 * </p> 484 * 485 * @see #getX(int) 486 * @see #getHistoricalX(int, int) 487 * @see MotionEvent.PointerCoords#x 488 * @see InputDevice#getMotionRange 489 */ 490 public static final int AXIS_X = 0; 491 492 /** 493 * Axis constant: Y axis of a motion event. 494 * <p> 495 * <ul> 496 * <li>For a touch screen, reports the absolute Y screen position of the center of 497 * the touch contact area. The units are display pixels. 498 * <li>For a touch pad, reports the absolute Y surface position of the center of the touch 499 * contact area. The units are device-dependent; use {@link InputDevice#getMotionRange(int)} 500 * to query the effective range of values. 501 * <li>For a mouse, reports the absolute Y screen position of the mouse pointer. 502 * The units are display pixels. 503 * <li>For a trackball, reports the relative vertical displacement of the trackball. 504 * The value is normalized to a range from -1.0 (up) to 1.0 (down). 505 * <li>For a joystick, reports the absolute Y position of the joystick. 506 * The value is normalized to a range from -1.0 (up or far) to 1.0 (down or near). 507 * </ul> 508 * </p> 509 * 510 * @see #getY(int) 511 * @see #getHistoricalY(int, int) 512 * @see MotionEvent.PointerCoords#y 513 * @see InputDevice#getMotionRange 514 */ 515 public static final int AXIS_Y = 1; 516 517 /** 518 * Axis constant: Pressure axis of a motion event. 519 * <p> 520 * <ul> 521 * <li>For a touch screen or touch pad, reports the approximate pressure applied to the surface 522 * by a finger or other tool. The value is normalized to a range from 523 * 0 (no pressure at all) to 1 (normal pressure), although values higher than 1 524 * may be generated depending on the calibration of the input device. 525 * <li>For a trackball, the value is set to 1 if the trackball button is pressed 526 * or 0 otherwise. 527 * <li>For a mouse, the value is set to 1 if the primary mouse button is pressed 528 * or 0 otherwise. 529 * </ul> 530 * </p> 531 * 532 * @see #getPressure(int) 533 * @see #getHistoricalPressure(int, int) 534 * @see MotionEvent.PointerCoords#pressure 535 * @see InputDevice#getMotionRange 536 */ 537 public static final int AXIS_PRESSURE = 2; 538 539 /** 540 * Axis constant: Size axis of a motion event. 541 * <p> 542 * <ul> 543 * <li>For a touch screen or touch pad, reports the approximate size of the contact area in 544 * relation to the maximum detectable size for the device. The value is normalized 545 * to a range from 0 (smallest detectable size) to 1 (largest detectable size), 546 * although it is not a linear scale. This value is of limited use. 547 * To obtain calibrated size information, use 548 * {@link #AXIS_TOUCH_MAJOR} or {@link #AXIS_TOOL_MAJOR}. 549 * </ul> 550 * </p> 551 * 552 * @see #getSize(int) 553 * @see #getHistoricalSize(int, int) 554 * @see MotionEvent.PointerCoords#size 555 * @see InputDevice#getMotionRange 556 */ 557 public static final int AXIS_SIZE = 3; 558 559 /** 560 * Axis constant: TouchMajor axis of a motion event. 561 * <p> 562 * <ul> 563 * <li>For a touch screen, reports the length of the major axis of an ellipse that 564 * represents the touch area at the point of contact. 565 * The units are display pixels. 566 * <li>For a touch pad, reports the length of the major axis of an ellipse that 567 * represents the touch area at the point of contact. 568 * The units are device-dependent; use {@link InputDevice#getMotionRange(int)} 569 * to query the effective range of values. 570 * </ul> 571 * </p> 572 * 573 * @see #getTouchMajor(int) 574 * @see #getHistoricalTouchMajor(int, int) 575 * @see MotionEvent.PointerCoords#touchMajor 576 * @see InputDevice#getMotionRange 577 */ 578 public static final int AXIS_TOUCH_MAJOR = 4; 579 580 /** 581 * Axis constant: TouchMinor axis of a motion event. 582 * <p> 583 * <ul> 584 * <li>For a touch screen, reports the length of the minor axis of an ellipse that 585 * represents the touch area at the point of contact. 586 * The units are display pixels. 587 * <li>For a touch pad, reports the length of the minor axis of an ellipse that 588 * represents the touch area at the point of contact. 589 * The units are device-dependent; use {@link InputDevice#getMotionRange(int)} 590 * to query the effective range of values. 591 * </ul> 592 * </p><p> 593 * When the touch is circular, the major and minor axis lengths will be equal to one another. 594 * </p> 595 * 596 * @see #getTouchMinor(int) 597 * @see #getHistoricalTouchMinor(int, int) 598 * @see MotionEvent.PointerCoords#touchMinor 599 * @see InputDevice#getMotionRange 600 */ 601 public static final int AXIS_TOUCH_MINOR = 5; 602 603 /** 604 * Axis constant: ToolMajor axis of a motion event. 605 * <p> 606 * <ul> 607 * <li>For a touch screen, reports the length of the major axis of an ellipse that 608 * represents the size of the approaching finger or tool used to make contact. 609 * <li>For a touch pad, reports the length of the major axis of an ellipse that 610 * represents the size of the approaching finger or tool used to make contact. 611 * The units are device-dependent; use {@link InputDevice#getMotionRange(int)} 612 * to query the effective range of values. 613 * </ul> 614 * </p><p> 615 * When the touch is circular, the major and minor axis lengths will be equal to one another. 616 * </p><p> 617 * The tool size may be larger than the touch size since the tool may not be fully 618 * in contact with the touch sensor. 619 * </p> 620 * 621 * @see #getToolMajor(int) 622 * @see #getHistoricalToolMajor(int, int) 623 * @see MotionEvent.PointerCoords#toolMajor 624 * @see InputDevice#getMotionRange 625 */ 626 public static final int AXIS_TOOL_MAJOR = 6; 627 628 /** 629 * Axis constant: ToolMinor axis of a motion event. 630 * <p> 631 * <ul> 632 * <li>For a touch screen, reports the length of the minor axis of an ellipse that 633 * represents the size of the approaching finger or tool used to make contact. 634 * <li>For a touch pad, reports the length of the minor axis of an ellipse that 635 * represents the size of the approaching finger or tool used to make contact. 636 * The units are device-dependent; use {@link InputDevice#getMotionRange(int)} 637 * to query the effective range of values. 638 * </ul> 639 * </p><p> 640 * When the touch is circular, the major and minor axis lengths will be equal to one another. 641 * </p><p> 642 * The tool size may be larger than the touch size since the tool may not be fully 643 * in contact with the touch sensor. 644 * </p> 645 * 646 * @see #getToolMinor(int) 647 * @see #getHistoricalToolMinor(int, int) 648 * @see MotionEvent.PointerCoords#toolMinor 649 * @see InputDevice#getMotionRange 650 */ 651 public static final int AXIS_TOOL_MINOR = 7; 652 653 /** 654 * Axis constant: Orientation axis of a motion event. 655 * <p> 656 * <ul> 657 * <li>For a touch screen or touch pad, reports the orientation of the finger 658 * or tool in radians relative to the vertical plane of the device. 659 * An angle of 0 radians indicates that the major axis of contact is oriented 660 * upwards, is perfectly circular or is of unknown orientation. A positive angle 661 * indicates that the major axis of contact is oriented to the right. A negative angle 662 * indicates that the major axis of contact is oriented to the left. 663 * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians 664 * (finger pointing fully right). 665 * <li>For a stylus, the orientation indicates the direction in which the stylus 666 * is pointing in relation to the vertical axis of the current orientation of the screen. 667 * The range is from -PI radians to PI radians, where 0 is pointing up, 668 * -PI/2 radians is pointing left, -PI or PI radians is pointing down, and PI/2 radians 669 * is pointing right. See also {@link #AXIS_TILT}. 670 * </ul> 671 * </p> 672 * 673 * @see #getOrientation(int) 674 * @see #getHistoricalOrientation(int, int) 675 * @see MotionEvent.PointerCoords#orientation 676 * @see InputDevice#getMotionRange 677 */ 678 public static final int AXIS_ORIENTATION = 8; 679 680 /** 681 * Axis constant: Vertical Scroll axis of a motion event. 682 * <p> 683 * <ul> 684 * <li>For a mouse, reports the relative movement of the vertical scroll wheel. 685 * The value is normalized to a range from -1.0 (down) to 1.0 (up). 686 * </ul> 687 * </p><p> 688 * This axis should be used to scroll views vertically. 689 * </p> 690 * 691 * @see #getAxisValue(int, int) 692 * @see #getHistoricalAxisValue(int, int, int) 693 * @see MotionEvent.PointerCoords#getAxisValue(int) 694 * @see InputDevice#getMotionRange 695 */ 696 public static final int AXIS_VSCROLL = 9; 697 698 /** 699 * Axis constant: Horizontal Scroll axis of a motion event. 700 * <p> 701 * <ul> 702 * <li>For a mouse, reports the relative movement of the horizontal scroll wheel. 703 * The value is normalized to a range from -1.0 (left) to 1.0 (right). 704 * </ul> 705 * </p><p> 706 * This axis should be used to scroll views horizontally. 707 * </p> 708 * 709 * @see #getAxisValue(int, int) 710 * @see #getHistoricalAxisValue(int, int, int) 711 * @see MotionEvent.PointerCoords#getAxisValue(int) 712 * @see InputDevice#getMotionRange 713 */ 714 public static final int AXIS_HSCROLL = 10; 715 716 /** 717 * Axis constant: Z axis of a motion event. 718 * <p> 719 * <ul> 720 * <li>For a joystick, reports the absolute Z position of the joystick. 721 * The value is normalized to a range from -1.0 (high) to 1.0 (low). 722 * <em>On game pads with two analog joysticks, this axis is often reinterpreted 723 * to report the absolute X position of the second joystick instead.</em> 724 * </ul> 725 * </p> 726 * 727 * @see #getAxisValue(int, int) 728 * @see #getHistoricalAxisValue(int, int, int) 729 * @see MotionEvent.PointerCoords#getAxisValue(int) 730 * @see InputDevice#getMotionRange 731 */ 732 public static final int AXIS_Z = 11; 733 734 /** 735 * Axis constant: X Rotation axis of a motion event. 736 * <p> 737 * <ul> 738 * <li>For a joystick, reports the absolute rotation angle about the X axis. 739 * The value is normalized to a range from -1.0 (counter-clockwise) to 1.0 (clockwise). 740 * </ul> 741 * </p> 742 * 743 * @see #getAxisValue(int, int) 744 * @see #getHistoricalAxisValue(int, int, int) 745 * @see MotionEvent.PointerCoords#getAxisValue(int) 746 * @see InputDevice#getMotionRange 747 */ 748 public static final int AXIS_RX = 12; 749 750 /** 751 * Axis constant: Y Rotation axis of a motion event. 752 * <p> 753 * <ul> 754 * <li>For a joystick, reports the absolute rotation angle about the Y axis. 755 * The value is normalized to a range from -1.0 (counter-clockwise) to 1.0 (clockwise). 756 * </ul> 757 * </p> 758 * 759 * @see #getAxisValue(int, int) 760 * @see #getHistoricalAxisValue(int, int, int) 761 * @see MotionEvent.PointerCoords#getAxisValue(int) 762 * @see InputDevice#getMotionRange 763 */ 764 public static final int AXIS_RY = 13; 765 766 /** 767 * Axis constant: Z Rotation axis of a motion event. 768 * <p> 769 * <ul> 770 * <li>For a joystick, reports the absolute rotation angle about the Z axis. 771 * The value is normalized to a range from -1.0 (counter-clockwise) to 1.0 (clockwise). 772 * <em>On game pads with two analog joysticks, this axis is often reinterpreted 773 * to report the absolute Y position of the second joystick instead.</em> 774 * </ul> 775 * </p> 776 * 777 * @see #getAxisValue(int, int) 778 * @see #getHistoricalAxisValue(int, int, int) 779 * @see MotionEvent.PointerCoords#getAxisValue(int) 780 * @see InputDevice#getMotionRange 781 */ 782 public static final int AXIS_RZ = 14; 783 784 /** 785 * Axis constant: Hat X axis of a motion event. 786 * <p> 787 * <ul> 788 * <li>For a joystick, reports the absolute X position of the directional hat control. 789 * The value is normalized to a range from -1.0 (left) to 1.0 (right). 790 * </ul> 791 * </p> 792 * 793 * @see #getAxisValue(int, int) 794 * @see #getHistoricalAxisValue(int, int, int) 795 * @see MotionEvent.PointerCoords#getAxisValue(int) 796 * @see InputDevice#getMotionRange 797 */ 798 public static final int AXIS_HAT_X = 15; 799 800 /** 801 * Axis constant: Hat Y axis of a motion event. 802 * <p> 803 * <ul> 804 * <li>For a joystick, reports the absolute Y position of the directional hat control. 805 * The value is normalized to a range from -1.0 (up) to 1.0 (down). 806 * </ul> 807 * </p> 808 * 809 * @see #getAxisValue(int, int) 810 * @see #getHistoricalAxisValue(int, int, int) 811 * @see MotionEvent.PointerCoords#getAxisValue(int) 812 * @see InputDevice#getMotionRange 813 */ 814 public static final int AXIS_HAT_Y = 16; 815 816 /** 817 * Axis constant: Left Trigger axis of a motion event. 818 * <p> 819 * <ul> 820 * <li>For a joystick, reports the absolute position of the left trigger control. 821 * The value is normalized to a range from 0.0 (released) to 1.0 (fully pressed). 822 * </ul> 823 * </p> 824 * 825 * @see #getAxisValue(int, int) 826 * @see #getHistoricalAxisValue(int, int, int) 827 * @see MotionEvent.PointerCoords#getAxisValue(int) 828 * @see InputDevice#getMotionRange 829 */ 830 public static final int AXIS_LTRIGGER = 17; 831 832 /** 833 * Axis constant: Right Trigger axis of a motion event. 834 * <p> 835 * <ul> 836 * <li>For a joystick, reports the absolute position of the right trigger control. 837 * The value is normalized to a range from 0.0 (released) to 1.0 (fully pressed). 838 * </ul> 839 * </p> 840 * 841 * @see #getAxisValue(int, int) 842 * @see #getHistoricalAxisValue(int, int, int) 843 * @see MotionEvent.PointerCoords#getAxisValue(int) 844 * @see InputDevice#getMotionRange 845 */ 846 public static final int AXIS_RTRIGGER = 18; 847 848 /** 849 * Axis constant: Throttle axis of a motion event. 850 * <p> 851 * <ul> 852 * <li>For a joystick, reports the absolute position of the throttle control. 853 * The value is normalized to a range from 0.0 (fully open) to 1.0 (fully closed). 854 * </ul> 855 * </p> 856 * 857 * @see #getAxisValue(int, int) 858 * @see #getHistoricalAxisValue(int, int, int) 859 * @see MotionEvent.PointerCoords#getAxisValue(int) 860 * @see InputDevice#getMotionRange 861 */ 862 public static final int AXIS_THROTTLE = 19; 863 864 /** 865 * Axis constant: Rudder axis of a motion event. 866 * <p> 867 * <ul> 868 * <li>For a joystick, reports the absolute position of the rudder control. 869 * The value is normalized to a range from -1.0 (turn left) to 1.0 (turn right). 870 * </ul> 871 * </p> 872 * 873 * @see #getAxisValue(int, int) 874 * @see #getHistoricalAxisValue(int, int, int) 875 * @see MotionEvent.PointerCoords#getAxisValue(int) 876 * @see InputDevice#getMotionRange 877 */ 878 public static final int AXIS_RUDDER = 20; 879 880 /** 881 * Axis constant: Wheel axis of a motion event. 882 * <p> 883 * <ul> 884 * <li>For a joystick, reports the absolute position of the steering wheel control. 885 * The value is normalized to a range from -1.0 (turn left) to 1.0 (turn right). 886 * </ul> 887 * </p> 888 * 889 * @see #getAxisValue(int, int) 890 * @see #getHistoricalAxisValue(int, int, int) 891 * @see MotionEvent.PointerCoords#getAxisValue(int) 892 * @see InputDevice#getMotionRange 893 */ 894 public static final int AXIS_WHEEL = 21; 895 896 /** 897 * Axis constant: Gas axis of a motion event. 898 * <p> 899 * <ul> 900 * <li>For a joystick, reports the absolute position of the gas (accelerator) control. 901 * The value is normalized to a range from 0.0 (no acceleration) 902 * to 1.0 (maximum acceleration). 903 * </ul> 904 * </p> 905 * 906 * @see #getAxisValue(int, int) 907 * @see #getHistoricalAxisValue(int, int, int) 908 * @see MotionEvent.PointerCoords#getAxisValue(int) 909 * @see InputDevice#getMotionRange 910 */ 911 public static final int AXIS_GAS = 22; 912 913 /** 914 * Axis constant: Brake axis of a motion event. 915 * <p> 916 * <ul> 917 * <li>For a joystick, reports the absolute position of the brake control. 918 * The value is normalized to a range from 0.0 (no braking) to 1.0 (maximum braking). 919 * </ul> 920 * </p> 921 * 922 * @see #getAxisValue(int, int) 923 * @see #getHistoricalAxisValue(int, int, int) 924 * @see MotionEvent.PointerCoords#getAxisValue(int) 925 * @see InputDevice#getMotionRange 926 */ 927 public static final int AXIS_BRAKE = 23; 928 929 /** 930 * Axis constant: Distance axis of a motion event. 931 * <p> 932 * <ul> 933 * <li>For a stylus, reports the distance of the stylus from the screen. 934 * A value of 0.0 indicates direct contact and larger values indicate increasing 935 * distance from the surface. 936 * </ul> 937 * </p> 938 * 939 * @see #getAxisValue(int, int) 940 * @see #getHistoricalAxisValue(int, int, int) 941 * @see MotionEvent.PointerCoords#getAxisValue(int) 942 * @see InputDevice#getMotionRange 943 */ 944 public static final int AXIS_DISTANCE = 24; 945 946 /** 947 * Axis constant: Tilt axis of a motion event. 948 * <p> 949 * <ul> 950 * <li>For a stylus, reports the tilt angle of the stylus in radians where 951 * 0 radians indicates that the stylus is being held perpendicular to the 952 * surface, and PI/2 radians indicates that the stylus is being held flat 953 * against the surface. 954 * </ul> 955 * </p> 956 * 957 * @see #getAxisValue(int, int) 958 * @see #getHistoricalAxisValue(int, int, int) 959 * @see MotionEvent.PointerCoords#getAxisValue(int, int) 960 * @see InputDevice#getMotionRange 961 */ 962 public static final int AXIS_TILT = 25; 963 964 /** 965 * Axis constant: Generic 1 axis of a motion event. 966 * The interpretation of a generic axis is device-specific. 967 * 968 * @see #getAxisValue(int, int) 969 * @see #getHistoricalAxisValue(int, int, int) 970 * @see MotionEvent.PointerCoords#getAxisValue(int) 971 * @see InputDevice#getMotionRange 972 */ 973 public static final int AXIS_GENERIC_1 = 32; 974 975 /** 976 * Axis constant: Generic 2 axis of a motion event. 977 * The interpretation of a generic axis is device-specific. 978 * 979 * @see #getAxisValue(int, int) 980 * @see #getHistoricalAxisValue(int, int, int) 981 * @see MotionEvent.PointerCoords#getAxisValue(int) 982 * @see InputDevice#getMotionRange 983 */ 984 public static final int AXIS_GENERIC_2 = 33; 985 986 /** 987 * Axis constant: Generic 3 axis of a motion event. 988 * The interpretation of a generic axis is device-specific. 989 * 990 * @see #getAxisValue(int, int) 991 * @see #getHistoricalAxisValue(int, int, int) 992 * @see MotionEvent.PointerCoords#getAxisValue(int) 993 * @see InputDevice#getMotionRange 994 */ 995 public static final int AXIS_GENERIC_3 = 34; 996 997 /** 998 * Axis constant: Generic 4 axis of a motion event. 999 * The interpretation of a generic axis is device-specific. 1000 * 1001 * @see #getAxisValue(int, int) 1002 * @see #getHistoricalAxisValue(int, int, int) 1003 * @see MotionEvent.PointerCoords#getAxisValue(int) 1004 * @see InputDevice#getMotionRange 1005 */ 1006 public static final int AXIS_GENERIC_4 = 35; 1007 1008 /** 1009 * Axis constant: Generic 5 axis of a motion event. 1010 * The interpretation of a generic axis is device-specific. 1011 * 1012 * @see #getAxisValue(int, int) 1013 * @see #getHistoricalAxisValue(int, int, int) 1014 * @see MotionEvent.PointerCoords#getAxisValue(int) 1015 * @see InputDevice#getMotionRange 1016 */ 1017 public static final int AXIS_GENERIC_5 = 36; 1018 1019 /** 1020 * Axis constant: Generic 6 axis of a motion event. 1021 * The interpretation of a generic axis is device-specific. 1022 * 1023 * @see #getAxisValue(int, int) 1024 * @see #getHistoricalAxisValue(int, int, int) 1025 * @see MotionEvent.PointerCoords#getAxisValue(int) 1026 * @see InputDevice#getMotionRange 1027 */ 1028 public static final int AXIS_GENERIC_6 = 37; 1029 1030 /** 1031 * Axis constant: Generic 7 axis of a motion event. 1032 * The interpretation of a generic axis is device-specific. 1033 * 1034 * @see #getAxisValue(int, int) 1035 * @see #getHistoricalAxisValue(int, int, int) 1036 * @see MotionEvent.PointerCoords#getAxisValue(int) 1037 * @see InputDevice#getMotionRange 1038 */ 1039 public static final int AXIS_GENERIC_7 = 38; 1040 1041 /** 1042 * Axis constant: Generic 8 axis of a motion event. 1043 * The interpretation of a generic axis is device-specific. 1044 * 1045 * @see #getAxisValue(int, int) 1046 * @see #getHistoricalAxisValue(int, int, int) 1047 * @see MotionEvent.PointerCoords#getAxisValue(int) 1048 * @see InputDevice#getMotionRange 1049 */ 1050 public static final int AXIS_GENERIC_8 = 39; 1051 1052 /** 1053 * Axis constant: Generic 9 axis of a motion event. 1054 * The interpretation of a generic axis is device-specific. 1055 * 1056 * @see #getAxisValue(int, int) 1057 * @see #getHistoricalAxisValue(int, int, int) 1058 * @see MotionEvent.PointerCoords#getAxisValue(int) 1059 * @see InputDevice#getMotionRange 1060 */ 1061 public static final int AXIS_GENERIC_9 = 40; 1062 1063 /** 1064 * Axis constant: Generic 10 axis of a motion event. 1065 * The interpretation of a generic axis is device-specific. 1066 * 1067 * @see #getAxisValue(int, int) 1068 * @see #getHistoricalAxisValue(int, int, int) 1069 * @see MotionEvent.PointerCoords#getAxisValue(int) 1070 * @see InputDevice#getMotionRange 1071 */ 1072 public static final int AXIS_GENERIC_10 = 41; 1073 1074 /** 1075 * Axis constant: Generic 11 axis of a motion event. 1076 * The interpretation of a generic axis is device-specific. 1077 * 1078 * @see #getAxisValue(int, int) 1079 * @see #getHistoricalAxisValue(int, int, int) 1080 * @see MotionEvent.PointerCoords#getAxisValue(int) 1081 * @see InputDevice#getMotionRange 1082 */ 1083 public static final int AXIS_GENERIC_11 = 42; 1084 1085 /** 1086 * Axis constant: Generic 12 axis of a motion event. 1087 * The interpretation of a generic axis is device-specific. 1088 * 1089 * @see #getAxisValue(int, int) 1090 * @see #getHistoricalAxisValue(int, int, int) 1091 * @see MotionEvent.PointerCoords#getAxisValue(int) 1092 * @see InputDevice#getMotionRange 1093 */ 1094 public static final int AXIS_GENERIC_12 = 43; 1095 1096 /** 1097 * Axis constant: Generic 13 axis of a motion event. 1098 * The interpretation of a generic axis is device-specific. 1099 * 1100 * @see #getAxisValue(int, int) 1101 * @see #getHistoricalAxisValue(int, int, int) 1102 * @see MotionEvent.PointerCoords#getAxisValue(int) 1103 * @see InputDevice#getMotionRange 1104 */ 1105 public static final int AXIS_GENERIC_13 = 44; 1106 1107 /** 1108 * Axis constant: Generic 14 axis of a motion event. 1109 * The interpretation of a generic axis is device-specific. 1110 * 1111 * @see #getAxisValue(int, int) 1112 * @see #getHistoricalAxisValue(int, int, int) 1113 * @see MotionEvent.PointerCoords#getAxisValue(int) 1114 * @see InputDevice#getMotionRange 1115 */ 1116 public static final int AXIS_GENERIC_14 = 45; 1117 1118 /** 1119 * Axis constant: Generic 15 axis of a motion event. 1120 * The interpretation of a generic axis is device-specific. 1121 * 1122 * @see #getAxisValue(int, int) 1123 * @see #getHistoricalAxisValue(int, int, int) 1124 * @see MotionEvent.PointerCoords#getAxisValue(int) 1125 * @see InputDevice#getMotionRange 1126 */ 1127 public static final int AXIS_GENERIC_15 = 46; 1128 1129 /** 1130 * Axis constant: Generic 16 axis of a motion event. 1131 * The interpretation of a generic axis is device-specific. 1132 * 1133 * @see #getAxisValue(int, int) 1134 * @see #getHistoricalAxisValue(int, int, int) 1135 * @see MotionEvent.PointerCoords#getAxisValue(int) 1136 * @see InputDevice#getMotionRange 1137 */ 1138 public static final int AXIS_GENERIC_16 = 47; 1139 1140 // NOTE: If you add a new axis here you must also add it to: 1141 // native/include/android/input.h 1142 // frameworks/base/include/ui/KeycodeLabels.h 1143 1144 // Symbolic names of all axes. 1145 private static final SparseArray<String> AXIS_SYMBOLIC_NAMES = new SparseArray<String>(); 1146 static { 1147 SparseArray<String> names = AXIS_SYMBOLIC_NAMES; names.append(AXIS_X, "AXIS_X")1148 names.append(AXIS_X, "AXIS_X"); names.append(AXIS_Y, "AXIS_Y")1149 names.append(AXIS_Y, "AXIS_Y"); names.append(AXIS_PRESSURE, "AXIS_PRESSURE")1150 names.append(AXIS_PRESSURE, "AXIS_PRESSURE"); names.append(AXIS_SIZE, "AXIS_SIZE")1151 names.append(AXIS_SIZE, "AXIS_SIZE"); names.append(AXIS_TOUCH_MAJOR, "AXIS_TOUCH_MAJOR")1152 names.append(AXIS_TOUCH_MAJOR, "AXIS_TOUCH_MAJOR"); names.append(AXIS_TOUCH_MINOR, "AXIS_TOUCH_MINOR")1153 names.append(AXIS_TOUCH_MINOR, "AXIS_TOUCH_MINOR"); names.append(AXIS_TOOL_MAJOR, "AXIS_TOOL_MAJOR")1154 names.append(AXIS_TOOL_MAJOR, "AXIS_TOOL_MAJOR"); names.append(AXIS_TOOL_MINOR, "AXIS_TOOL_MINOR")1155 names.append(AXIS_TOOL_MINOR, "AXIS_TOOL_MINOR"); names.append(AXIS_ORIENTATION, "AXIS_ORIENTATION")1156 names.append(AXIS_ORIENTATION, "AXIS_ORIENTATION"); names.append(AXIS_VSCROLL, "AXIS_VSCROLL")1157 names.append(AXIS_VSCROLL, "AXIS_VSCROLL"); names.append(AXIS_HSCROLL, "AXIS_HSCROLL")1158 names.append(AXIS_HSCROLL, "AXIS_HSCROLL"); names.append(AXIS_Z, "AXIS_Z")1159 names.append(AXIS_Z, "AXIS_Z"); names.append(AXIS_RX, "AXIS_RX")1160 names.append(AXIS_RX, "AXIS_RX"); names.append(AXIS_RY, "AXIS_RY")1161 names.append(AXIS_RY, "AXIS_RY"); names.append(AXIS_RZ, "AXIS_RZ")1162 names.append(AXIS_RZ, "AXIS_RZ"); names.append(AXIS_HAT_X, "AXIS_HAT_X")1163 names.append(AXIS_HAT_X, "AXIS_HAT_X"); names.append(AXIS_HAT_Y, "AXIS_HAT_Y")1164 names.append(AXIS_HAT_Y, "AXIS_HAT_Y"); names.append(AXIS_LTRIGGER, "AXIS_LTRIGGER")1165 names.append(AXIS_LTRIGGER, "AXIS_LTRIGGER"); names.append(AXIS_RTRIGGER, "AXIS_RTRIGGER")1166 names.append(AXIS_RTRIGGER, "AXIS_RTRIGGER"); names.append(AXIS_THROTTLE, "AXIS_THROTTLE")1167 names.append(AXIS_THROTTLE, "AXIS_THROTTLE"); names.append(AXIS_RUDDER, "AXIS_RUDDER")1168 names.append(AXIS_RUDDER, "AXIS_RUDDER"); names.append(AXIS_WHEEL, "AXIS_WHEEL")1169 names.append(AXIS_WHEEL, "AXIS_WHEEL"); names.append(AXIS_GAS, "AXIS_GAS")1170 names.append(AXIS_GAS, "AXIS_GAS"); names.append(AXIS_BRAKE, "AXIS_BRAKE")1171 names.append(AXIS_BRAKE, "AXIS_BRAKE"); names.append(AXIS_DISTANCE, "AXIS_DISTANCE")1172 names.append(AXIS_DISTANCE, "AXIS_DISTANCE"); names.append(AXIS_TILT, "AXIS_TILT")1173 names.append(AXIS_TILT, "AXIS_TILT"); names.append(AXIS_GENERIC_1, "AXIS_GENERIC_1")1174 names.append(AXIS_GENERIC_1, "AXIS_GENERIC_1"); names.append(AXIS_GENERIC_2, "AXIS_GENERIC_2")1175 names.append(AXIS_GENERIC_2, "AXIS_GENERIC_2"); names.append(AXIS_GENERIC_3, "AXIS_GENERIC_3")1176 names.append(AXIS_GENERIC_3, "AXIS_GENERIC_3"); names.append(AXIS_GENERIC_4, "AXIS_GENERIC_4")1177 names.append(AXIS_GENERIC_4, "AXIS_GENERIC_4"); names.append(AXIS_GENERIC_5, "AXIS_GENERIC_5")1178 names.append(AXIS_GENERIC_5, "AXIS_GENERIC_5"); names.append(AXIS_GENERIC_6, "AXIS_GENERIC_6")1179 names.append(AXIS_GENERIC_6, "AXIS_GENERIC_6"); names.append(AXIS_GENERIC_7, "AXIS_GENERIC_7")1180 names.append(AXIS_GENERIC_7, "AXIS_GENERIC_7"); names.append(AXIS_GENERIC_8, "AXIS_GENERIC_8")1181 names.append(AXIS_GENERIC_8, "AXIS_GENERIC_8"); names.append(AXIS_GENERIC_9, "AXIS_GENERIC_9")1182 names.append(AXIS_GENERIC_9, "AXIS_GENERIC_9"); names.append(AXIS_GENERIC_10, "AXIS_GENERIC_10")1183 names.append(AXIS_GENERIC_10, "AXIS_GENERIC_10"); names.append(AXIS_GENERIC_11, "AXIS_GENERIC_11")1184 names.append(AXIS_GENERIC_11, "AXIS_GENERIC_11"); names.append(AXIS_GENERIC_12, "AXIS_GENERIC_12")1185 names.append(AXIS_GENERIC_12, "AXIS_GENERIC_12"); names.append(AXIS_GENERIC_13, "AXIS_GENERIC_13")1186 names.append(AXIS_GENERIC_13, "AXIS_GENERIC_13"); names.append(AXIS_GENERIC_14, "AXIS_GENERIC_14")1187 names.append(AXIS_GENERIC_14, "AXIS_GENERIC_14"); names.append(AXIS_GENERIC_15, "AXIS_GENERIC_15")1188 names.append(AXIS_GENERIC_15, "AXIS_GENERIC_15"); names.append(AXIS_GENERIC_16, "AXIS_GENERIC_16")1189 names.append(AXIS_GENERIC_16, "AXIS_GENERIC_16"); 1190 } 1191 1192 /** 1193 * Button constant: Primary button (left mouse button). 1194 * 1195 * This button constant is not set in response to simple touches with a finger 1196 * or stylus tip. The user must actually push a button. 1197 * 1198 * @see #getButtonState 1199 */ 1200 public static final int BUTTON_PRIMARY = 1 << 0; 1201 1202 /** 1203 * Button constant: Secondary button (right mouse button). 1204 * 1205 * @see #getButtonState 1206 */ 1207 public static final int BUTTON_SECONDARY = 1 << 1; 1208 1209 /** 1210 * Button constant: Tertiary button (middle mouse button). 1211 * 1212 * @see #getButtonState 1213 */ 1214 public static final int BUTTON_TERTIARY = 1 << 2; 1215 1216 /** 1217 * Button constant: Back button pressed (mouse back button). 1218 * <p> 1219 * The system may send a {@link KeyEvent#KEYCODE_BACK} key press to the application 1220 * when this button is pressed. 1221 * </p> 1222 * 1223 * @see #getButtonState 1224 */ 1225 public static final int BUTTON_BACK = 1 << 3; 1226 1227 /** 1228 * Button constant: Forward button pressed (mouse forward button). 1229 * <p> 1230 * The system may send a {@link KeyEvent#KEYCODE_FORWARD} key press to the application 1231 * when this button is pressed. 1232 * </p> 1233 * 1234 * @see #getButtonState 1235 */ 1236 public static final int BUTTON_FORWARD = 1 << 4; 1237 1238 /** 1239 * Button constant: Primary stylus button pressed. 1240 * 1241 * @see #getButtonState 1242 */ 1243 public static final int BUTTON_STYLUS_PRIMARY = 1 << 5; 1244 1245 /** 1246 * Button constant: Secondary stylus button pressed. 1247 * 1248 * @see #getButtonState 1249 */ 1250 public static final int BUTTON_STYLUS_SECONDARY = 1 << 6; 1251 1252 // NOTE: If you add a new axis here you must also add it to: 1253 // native/include/android/input.h 1254 1255 // Symbolic names of all button states in bit order from least significant 1256 // to most significant. 1257 private static final String[] BUTTON_SYMBOLIC_NAMES = new String[] { 1258 "BUTTON_PRIMARY", 1259 "BUTTON_SECONDARY", 1260 "BUTTON_TERTIARY", 1261 "BUTTON_BACK", 1262 "BUTTON_FORWARD", 1263 "BUTTON_STYLUS_PRIMARY", 1264 "BUTTON_STYLUS_SECONDARY", 1265 "0x00000080", 1266 "0x00000100", 1267 "0x00000200", 1268 "0x00000400", 1269 "0x00000800", 1270 "0x00001000", 1271 "0x00002000", 1272 "0x00004000", 1273 "0x00008000", 1274 "0x00010000", 1275 "0x00020000", 1276 "0x00040000", 1277 "0x00080000", 1278 "0x00100000", 1279 "0x00200000", 1280 "0x00400000", 1281 "0x00800000", 1282 "0x01000000", 1283 "0x02000000", 1284 "0x04000000", 1285 "0x08000000", 1286 "0x10000000", 1287 "0x20000000", 1288 "0x40000000", 1289 "0x80000000", 1290 }; 1291 1292 /** 1293 * Tool type constant: Unknown tool type. 1294 * This constant is used when the tool type is not known or is not relevant, 1295 * such as for a trackball or other non-pointing device. 1296 * 1297 * @see #getToolType 1298 */ 1299 public static final int TOOL_TYPE_UNKNOWN = 0; 1300 1301 /** 1302 * Tool type constant: The tool is a finger. 1303 * 1304 * @see #getToolType 1305 */ 1306 public static final int TOOL_TYPE_FINGER = 1; 1307 1308 /** 1309 * Tool type constant: The tool is a stylus. 1310 * 1311 * @see #getToolType 1312 */ 1313 public static final int TOOL_TYPE_STYLUS = 2; 1314 1315 /** 1316 * Tool type constant: The tool is a mouse or trackpad. 1317 * 1318 * @see #getToolType 1319 */ 1320 public static final int TOOL_TYPE_MOUSE = 3; 1321 1322 /** 1323 * Tool type constant: The tool is an eraser or a stylus being used in an inverted posture. 1324 * 1325 * @see #getToolType 1326 */ 1327 public static final int TOOL_TYPE_ERASER = 4; 1328 1329 // NOTE: If you add a new tool type here you must also add it to: 1330 // native/include/android/input.h 1331 1332 // Symbolic names of all tool types. 1333 private static final SparseArray<String> TOOL_TYPE_SYMBOLIC_NAMES = new SparseArray<String>(); 1334 static { 1335 SparseArray<String> names = TOOL_TYPE_SYMBOLIC_NAMES; names.append(TOOL_TYPE_UNKNOWN, "TOOL_TYPE_UNKNOWN")1336 names.append(TOOL_TYPE_UNKNOWN, "TOOL_TYPE_UNKNOWN"); names.append(TOOL_TYPE_FINGER, "TOOL_TYPE_FINGER")1337 names.append(TOOL_TYPE_FINGER, "TOOL_TYPE_FINGER"); names.append(TOOL_TYPE_STYLUS, "TOOL_TYPE_STYLUS")1338 names.append(TOOL_TYPE_STYLUS, "TOOL_TYPE_STYLUS"); names.append(TOOL_TYPE_MOUSE, "TOOL_TYPE_MOUSE")1339 names.append(TOOL_TYPE_MOUSE, "TOOL_TYPE_MOUSE"); names.append(TOOL_TYPE_ERASER, "TOOL_TYPE_ERASER")1340 names.append(TOOL_TYPE_ERASER, "TOOL_TYPE_ERASER"); 1341 } 1342 1343 // Private value for history pos that obtains the current sample. 1344 private static final int HISTORY_CURRENT = -0x80000000; 1345 1346 private static final int MAX_RECYCLED = 10; 1347 private static final Object gRecyclerLock = new Object(); 1348 private static int gRecyclerUsed; 1349 private static MotionEvent gRecyclerTop; 1350 1351 // Shared temporary objects used when translating coordinates supplied by 1352 // the caller into single element PointerCoords and pointer id arrays. 1353 private static final Object gSharedTempLock = new Object(); 1354 private static PointerCoords[] gSharedTempPointerCoords; 1355 private static PointerProperties[] gSharedTempPointerProperties; 1356 private static int[] gSharedTempPointerIndexMap; 1357 ensureSharedTempPointerCapacity(int desiredCapacity)1358 private static final void ensureSharedTempPointerCapacity(int desiredCapacity) { 1359 if (gSharedTempPointerCoords == null 1360 || gSharedTempPointerCoords.length < desiredCapacity) { 1361 int capacity = gSharedTempPointerCoords != null ? gSharedTempPointerCoords.length : 8; 1362 while (capacity < desiredCapacity) { 1363 capacity *= 2; 1364 } 1365 gSharedTempPointerCoords = PointerCoords.createArray(capacity); 1366 gSharedTempPointerProperties = PointerProperties.createArray(capacity); 1367 gSharedTempPointerIndexMap = new int[capacity]; 1368 } 1369 } 1370 1371 // Pointer to the native MotionEvent object that contains the actual data. 1372 private long mNativePtr; 1373 1374 private MotionEvent mNext; 1375 nativeInitialize(long nativePtr, int deviceId, int source, int action, int flags, int edgeFlags, int metaState, int buttonState, float xOffset, float yOffset, float xPrecision, float yPrecision, long downTimeNanos, long eventTimeNanos, int pointerCount, PointerProperties[] pointerIds, PointerCoords[] pointerCoords)1376 private static native long nativeInitialize(long nativePtr, 1377 int deviceId, int source, int action, int flags, int edgeFlags, 1378 int metaState, int buttonState, 1379 float xOffset, float yOffset, float xPrecision, float yPrecision, 1380 long downTimeNanos, long eventTimeNanos, 1381 int pointerCount, PointerProperties[] pointerIds, PointerCoords[] pointerCoords); nativeCopy(long destNativePtr, long sourceNativePtr, boolean keepHistory)1382 private static native long nativeCopy(long destNativePtr, long sourceNativePtr, 1383 boolean keepHistory); nativeDispose(long nativePtr)1384 private static native void nativeDispose(long nativePtr); nativeAddBatch(long nativePtr, long eventTimeNanos, PointerCoords[] pointerCoords, int metaState)1385 private static native void nativeAddBatch(long nativePtr, long eventTimeNanos, 1386 PointerCoords[] pointerCoords, int metaState); 1387 nativeGetDeviceId(long nativePtr)1388 private static native int nativeGetDeviceId(long nativePtr); nativeGetSource(long nativePtr)1389 private static native int nativeGetSource(long nativePtr); nativeSetSource(long nativePtr, int source)1390 private static native int nativeSetSource(long nativePtr, int source); nativeGetAction(long nativePtr)1391 private static native int nativeGetAction(long nativePtr); nativeSetAction(long nativePtr, int action)1392 private static native void nativeSetAction(long nativePtr, int action); nativeIsTouchEvent(long nativePtr)1393 private static native boolean nativeIsTouchEvent(long nativePtr); nativeGetFlags(long nativePtr)1394 private static native int nativeGetFlags(long nativePtr); nativeSetFlags(long nativePtr, int flags)1395 private static native void nativeSetFlags(long nativePtr, int flags); nativeGetEdgeFlags(long nativePtr)1396 private static native int nativeGetEdgeFlags(long nativePtr); nativeSetEdgeFlags(long nativePtr, int action)1397 private static native void nativeSetEdgeFlags(long nativePtr, int action); nativeGetMetaState(long nativePtr)1398 private static native int nativeGetMetaState(long nativePtr); nativeGetButtonState(long nativePtr)1399 private static native int nativeGetButtonState(long nativePtr); nativeSetButtonState(long nativePtr, int buttonState)1400 private static native void nativeSetButtonState(long nativePtr, int buttonState); nativeGetActionButton(long nativePtr)1401 private static native int nativeGetActionButton(long nativePtr); nativeSetActionButton(long nativePtr, int actionButton)1402 private static native void nativeSetActionButton(long nativePtr, int actionButton); nativeOffsetLocation(long nativePtr, float deltaX, float deltaY)1403 private static native void nativeOffsetLocation(long nativePtr, float deltaX, float deltaY); nativeGetXOffset(long nativePtr)1404 private static native float nativeGetXOffset(long nativePtr); nativeGetYOffset(long nativePtr)1405 private static native float nativeGetYOffset(long nativePtr); nativeGetXPrecision(long nativePtr)1406 private static native float nativeGetXPrecision(long nativePtr); nativeGetYPrecision(long nativePtr)1407 private static native float nativeGetYPrecision(long nativePtr); nativeGetDownTimeNanos(long nativePtr)1408 private static native long nativeGetDownTimeNanos(long nativePtr); nativeSetDownTimeNanos(long nativePtr, long downTime)1409 private static native void nativeSetDownTimeNanos(long nativePtr, long downTime); 1410 nativeGetPointerCount(long nativePtr)1411 private static native int nativeGetPointerCount(long nativePtr); nativeGetPointerId(long nativePtr, int pointerIndex)1412 private static native int nativeGetPointerId(long nativePtr, int pointerIndex); nativeGetToolType(long nativePtr, int pointerIndex)1413 private static native int nativeGetToolType(long nativePtr, int pointerIndex); nativeFindPointerIndex(long nativePtr, int pointerId)1414 private static native int nativeFindPointerIndex(long nativePtr, int pointerId); 1415 nativeGetHistorySize(long nativePtr)1416 private static native int nativeGetHistorySize(long nativePtr); nativeGetEventTimeNanos(long nativePtr, int historyPos)1417 private static native long nativeGetEventTimeNanos(long nativePtr, int historyPos); nativeGetRawAxisValue(long nativePtr, int axis, int pointerIndex, int historyPos)1418 private static native float nativeGetRawAxisValue(long nativePtr, 1419 int axis, int pointerIndex, int historyPos); nativeGetAxisValue(long nativePtr, int axis, int pointerIndex, int historyPos)1420 private static native float nativeGetAxisValue(long nativePtr, 1421 int axis, int pointerIndex, int historyPos); nativeGetPointerCoords(long nativePtr, int pointerIndex, int historyPos, PointerCoords outPointerCoords)1422 private static native void nativeGetPointerCoords(long nativePtr, 1423 int pointerIndex, int historyPos, PointerCoords outPointerCoords); nativeGetPointerProperties(long nativePtr, int pointerIndex, PointerProperties outPointerProperties)1424 private static native void nativeGetPointerProperties(long nativePtr, 1425 int pointerIndex, PointerProperties outPointerProperties); 1426 nativeScale(long nativePtr, float scale)1427 private static native void nativeScale(long nativePtr, float scale); nativeTransform(long nativePtr, Matrix matrix)1428 private static native void nativeTransform(long nativePtr, Matrix matrix); 1429 nativeReadFromParcel(long nativePtr, Parcel parcel)1430 private static native long nativeReadFromParcel(long nativePtr, Parcel parcel); nativeWriteToParcel(long nativePtr, Parcel parcel)1431 private static native void nativeWriteToParcel(long nativePtr, Parcel parcel); 1432 nativeAxisToString(int axis)1433 private static native String nativeAxisToString(int axis); nativeAxisFromString(String label)1434 private static native int nativeAxisFromString(String label); 1435 MotionEvent()1436 private MotionEvent() { 1437 } 1438 1439 @Override finalize()1440 protected void finalize() throws Throwable { 1441 try { 1442 if (mNativePtr != 0) { 1443 nativeDispose(mNativePtr); 1444 mNativePtr = 0; 1445 } 1446 } finally { 1447 super.finalize(); 1448 } 1449 } 1450 obtain()1451 static private MotionEvent obtain() { 1452 final MotionEvent ev; 1453 synchronized (gRecyclerLock) { 1454 ev = gRecyclerTop; 1455 if (ev == null) { 1456 return new MotionEvent(); 1457 } 1458 gRecyclerTop = ev.mNext; 1459 gRecyclerUsed -= 1; 1460 } 1461 ev.mNext = null; 1462 ev.prepareForReuse(); 1463 return ev; 1464 } 1465 1466 /** 1467 * Create a new MotionEvent, filling in all of the basic values that 1468 * define the motion. 1469 * 1470 * @param downTime The time (in ms) when the user originally pressed down to start 1471 * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 1472 * @param eventTime The the time (in ms) when this specific event was generated. This 1473 * must be obtained from {@link SystemClock#uptimeMillis()}. 1474 * @param action The kind of action being performed, such as {@link #ACTION_DOWN}. 1475 * @param pointerCount The number of pointers that will be in this event. 1476 * @param pointerProperties An array of <em>pointerCount</em> values providing 1477 * a {@link PointerProperties} property object for each pointer, which must 1478 * include the pointer identifier. 1479 * @param pointerCoords An array of <em>pointerCount</em> values providing 1480 * a {@link PointerCoords} coordinate object for each pointer. 1481 * @param metaState The state of any meta / modifier keys that were in effect when 1482 * the event was generated. 1483 * @param buttonState The state of buttons that are pressed. 1484 * @param xPrecision The precision of the X coordinate being reported. 1485 * @param yPrecision The precision of the Y coordinate being reported. 1486 * @param deviceId The id for the device that this event came from. An id of 1487 * zero indicates that the event didn't come from a physical device; other 1488 * numbers are arbitrary and you shouldn't depend on the values. 1489 * @param edgeFlags A bitfield indicating which edges, if any, were touched by this 1490 * MotionEvent. 1491 * @param source The source of this event. 1492 * @param flags The motion event flags. 1493 */ obtain(long downTime, long eventTime, int action, int pointerCount, PointerProperties[] pointerProperties, PointerCoords[] pointerCoords, int metaState, int buttonState, float xPrecision, float yPrecision, int deviceId, int edgeFlags, int source, int flags)1494 static public MotionEvent obtain(long downTime, long eventTime, 1495 int action, int pointerCount, PointerProperties[] pointerProperties, 1496 PointerCoords[] pointerCoords, int metaState, int buttonState, 1497 float xPrecision, float yPrecision, int deviceId, 1498 int edgeFlags, int source, int flags) { 1499 MotionEvent ev = obtain(); 1500 ev.mNativePtr = nativeInitialize(ev.mNativePtr, 1501 deviceId, source, action, flags, edgeFlags, metaState, buttonState, 1502 0, 0, xPrecision, yPrecision, 1503 downTime * NS_PER_MS, eventTime * NS_PER_MS, 1504 pointerCount, pointerProperties, pointerCoords); 1505 return ev; 1506 } 1507 1508 /** 1509 * Create a new MotionEvent, filling in all of the basic values that 1510 * define the motion. 1511 * 1512 * @param downTime The time (in ms) when the user originally pressed down to start 1513 * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 1514 * @param eventTime The the time (in ms) when this specific event was generated. This 1515 * must be obtained from {@link SystemClock#uptimeMillis()}. 1516 * @param action The kind of action being performed, such as {@link #ACTION_DOWN}. 1517 * @param pointerCount The number of pointers that will be in this event. 1518 * @param pointerIds An array of <em>pointerCount</em> values providing 1519 * an identifier for each pointer. 1520 * @param pointerCoords An array of <em>pointerCount</em> values providing 1521 * a {@link PointerCoords} coordinate object for each pointer. 1522 * @param metaState The state of any meta / modifier keys that were in effect when 1523 * the event was generated. 1524 * @param xPrecision The precision of the X coordinate being reported. 1525 * @param yPrecision The precision of the Y coordinate being reported. 1526 * @param deviceId The id for the device that this event came from. An id of 1527 * zero indicates that the event didn't come from a physical device; other 1528 * numbers are arbitrary and you shouldn't depend on the values. 1529 * @param edgeFlags A bitfield indicating which edges, if any, were touched by this 1530 * MotionEvent. 1531 * @param source The source of this event. 1532 * @param flags The motion event flags. 1533 * 1534 * @deprecated Use {@link #obtain(long, long, int, int, PointerProperties[], PointerCoords[], int, int, float, float, int, int, int, int)} 1535 * instead. 1536 */ 1537 @Deprecated obtain(long downTime, long eventTime, int action, int pointerCount, int[] pointerIds, PointerCoords[] pointerCoords, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags, int source, int flags)1538 static public MotionEvent obtain(long downTime, long eventTime, 1539 int action, int pointerCount, int[] pointerIds, PointerCoords[] pointerCoords, 1540 int metaState, float xPrecision, float yPrecision, int deviceId, 1541 int edgeFlags, int source, int flags) { 1542 synchronized (gSharedTempLock) { 1543 ensureSharedTempPointerCapacity(pointerCount); 1544 final PointerProperties[] pp = gSharedTempPointerProperties; 1545 for (int i = 0; i < pointerCount; i++) { 1546 pp[i].clear(); 1547 pp[i].id = pointerIds[i]; 1548 } 1549 return obtain(downTime, eventTime, action, pointerCount, pp, 1550 pointerCoords, metaState, 0, xPrecision, yPrecision, deviceId, 1551 edgeFlags, source, flags); 1552 } 1553 } 1554 1555 /** 1556 * Create a new MotionEvent, filling in all of the basic values that 1557 * define the motion. 1558 * 1559 * @param downTime The time (in ms) when the user originally pressed down to start 1560 * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 1561 * @param eventTime The the time (in ms) when this specific event was generated. This 1562 * must be obtained from {@link SystemClock#uptimeMillis()}. 1563 * @param action The kind of action being performed, such as {@link #ACTION_DOWN}. 1564 * @param x The X coordinate of this event. 1565 * @param y The Y coordinate of this event. 1566 * @param pressure The current pressure of this event. The pressure generally 1567 * ranges from 0 (no pressure at all) to 1 (normal pressure), however 1568 * values higher than 1 may be generated depending on the calibration of 1569 * the input device. 1570 * @param size A scaled value of the approximate size of the area being pressed when 1571 * touched with the finger. The actual value in pixels corresponding to the finger 1572 * touch is normalized with a device specific range of values 1573 * and scaled to a value between 0 and 1. 1574 * @param metaState The state of any meta / modifier keys that were in effect when 1575 * the event was generated. 1576 * @param xPrecision The precision of the X coordinate being reported. 1577 * @param yPrecision The precision of the Y coordinate being reported. 1578 * @param deviceId The id for the device that this event came from. An id of 1579 * zero indicates that the event didn't come from a physical device; other 1580 * numbers are arbitrary and you shouldn't depend on the values. 1581 * @param edgeFlags A bitfield indicating which edges, if any, were touched by this 1582 * MotionEvent. 1583 */ obtain(long downTime, long eventTime, int action, float x, float y, float pressure, float size, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags)1584 static public MotionEvent obtain(long downTime, long eventTime, int action, 1585 float x, float y, float pressure, float size, int metaState, 1586 float xPrecision, float yPrecision, int deviceId, int edgeFlags) { 1587 MotionEvent ev = obtain(); 1588 synchronized (gSharedTempLock) { 1589 ensureSharedTempPointerCapacity(1); 1590 final PointerProperties[] pp = gSharedTempPointerProperties; 1591 pp[0].clear(); 1592 pp[0].id = 0; 1593 1594 final PointerCoords pc[] = gSharedTempPointerCoords; 1595 pc[0].clear(); 1596 pc[0].x = x; 1597 pc[0].y = y; 1598 pc[0].pressure = pressure; 1599 pc[0].size = size; 1600 1601 ev.mNativePtr = nativeInitialize(ev.mNativePtr, 1602 deviceId, InputDevice.SOURCE_UNKNOWN, action, 0, edgeFlags, metaState, 0, 1603 0, 0, xPrecision, yPrecision, 1604 downTime * NS_PER_MS, eventTime * NS_PER_MS, 1605 1, pp, pc); 1606 return ev; 1607 } 1608 } 1609 1610 /** 1611 * Create a new MotionEvent, filling in all of the basic values that 1612 * define the motion. 1613 * 1614 * @param downTime The time (in ms) when the user originally pressed down to start 1615 * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 1616 * @param eventTime The the time (in ms) when this specific event was generated. This 1617 * must be obtained from {@link SystemClock#uptimeMillis()}. 1618 * @param action The kind of action being performed, such as {@link #ACTION_DOWN}. 1619 * @param pointerCount The number of pointers that are active in this event. 1620 * @param x The X coordinate of this event. 1621 * @param y The Y coordinate of this event. 1622 * @param pressure The current pressure of this event. The pressure generally 1623 * ranges from 0 (no pressure at all) to 1 (normal pressure), however 1624 * values higher than 1 may be generated depending on the calibration of 1625 * the input device. 1626 * @param size A scaled value of the approximate size of the area being pressed when 1627 * touched with the finger. The actual value in pixels corresponding to the finger 1628 * touch is normalized with a device specific range of values 1629 * and scaled to a value between 0 and 1. 1630 * @param metaState The state of any meta / modifier keys that were in effect when 1631 * the event was generated. 1632 * @param xPrecision The precision of the X coordinate being reported. 1633 * @param yPrecision The precision of the Y coordinate being reported. 1634 * @param deviceId The id for the device that this event came from. An id of 1635 * zero indicates that the event didn't come from a physical device; other 1636 * numbers are arbitrary and you shouldn't depend on the values. 1637 * @param edgeFlags A bitfield indicating which edges, if any, were touched by this 1638 * MotionEvent. 1639 * 1640 * @deprecated Use {@link #obtain(long, long, int, float, float, float, float, int, float, float, int, int)} 1641 * instead. 1642 */ 1643 @Deprecated obtain(long downTime, long eventTime, int action, int pointerCount, float x, float y, float pressure, float size, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags)1644 static public MotionEvent obtain(long downTime, long eventTime, int action, 1645 int pointerCount, float x, float y, float pressure, float size, int metaState, 1646 float xPrecision, float yPrecision, int deviceId, int edgeFlags) { 1647 return obtain(downTime, eventTime, action, x, y, pressure, size, 1648 metaState, xPrecision, yPrecision, deviceId, edgeFlags); 1649 } 1650 1651 /** 1652 * Create a new MotionEvent, filling in a subset of the basic motion 1653 * values. Those not specified here are: device id (always 0), pressure 1654 * and size (always 1), x and y precision (always 1), and edgeFlags (always 0). 1655 * 1656 * @param downTime The time (in ms) when the user originally pressed down to start 1657 * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. 1658 * @param eventTime The the time (in ms) when this specific event was generated. This 1659 * must be obtained from {@link SystemClock#uptimeMillis()}. 1660 * @param action The kind of action being performed, such as {@link #ACTION_DOWN}. 1661 * @param x The X coordinate of this event. 1662 * @param y The Y coordinate of this event. 1663 * @param metaState The state of any meta / modifier keys that were in effect when 1664 * the event was generated. 1665 */ obtain(long downTime, long eventTime, int action, float x, float y, int metaState)1666 static public MotionEvent obtain(long downTime, long eventTime, int action, 1667 float x, float y, int metaState) { 1668 return obtain(downTime, eventTime, action, x, y, 1.0f, 1.0f, 1669 metaState, 1.0f, 1.0f, 0, 0); 1670 } 1671 1672 /** 1673 * Create a new MotionEvent, copying from an existing one. 1674 */ obtain(MotionEvent other)1675 static public MotionEvent obtain(MotionEvent other) { 1676 if (other == null) { 1677 throw new IllegalArgumentException("other motion event must not be null"); 1678 } 1679 1680 MotionEvent ev = obtain(); 1681 ev.mNativePtr = nativeCopy(ev.mNativePtr, other.mNativePtr, true /*keepHistory*/); 1682 return ev; 1683 } 1684 1685 /** 1686 * Create a new MotionEvent, copying from an existing one, but not including 1687 * any historical point information. 1688 */ obtainNoHistory(MotionEvent other)1689 static public MotionEvent obtainNoHistory(MotionEvent other) { 1690 if (other == null) { 1691 throw new IllegalArgumentException("other motion event must not be null"); 1692 } 1693 1694 MotionEvent ev = obtain(); 1695 ev.mNativePtr = nativeCopy(ev.mNativePtr, other.mNativePtr, false /*keepHistory*/); 1696 return ev; 1697 } 1698 1699 /** @hide */ 1700 @Override copy()1701 public MotionEvent copy() { 1702 return obtain(this); 1703 } 1704 1705 /** 1706 * Recycle the MotionEvent, to be re-used by a later caller. After calling 1707 * this function you must not ever touch the event again. 1708 */ 1709 @Override recycle()1710 public final void recycle() { 1711 super.recycle(); 1712 1713 synchronized (gRecyclerLock) { 1714 if (gRecyclerUsed < MAX_RECYCLED) { 1715 gRecyclerUsed++; 1716 mNext = gRecyclerTop; 1717 gRecyclerTop = this; 1718 } 1719 } 1720 } 1721 1722 /** 1723 * Applies a scale factor to all points within this event. 1724 * 1725 * This method is used to adjust touch events to simulate different density 1726 * displays for compatibility mode. The values returned by {@link #getRawX()}, 1727 * {@link #getRawY()}, {@link #getXPrecision()} and {@link #getYPrecision()} 1728 * are also affected by the scale factor. 1729 * 1730 * @param scale The scale factor to apply. 1731 * @hide 1732 */ scale(float scale)1733 public final void scale(float scale) { 1734 if (scale != 1.0f) { 1735 nativeScale(mNativePtr, scale); 1736 } 1737 } 1738 1739 /** {@inheritDoc} */ 1740 @Override getDeviceId()1741 public final int getDeviceId() { 1742 return nativeGetDeviceId(mNativePtr); 1743 } 1744 1745 /** {@inheritDoc} */ 1746 @Override getSource()1747 public final int getSource() { 1748 return nativeGetSource(mNativePtr); 1749 } 1750 1751 /** {@inheritDoc} */ 1752 @Override setSource(int source)1753 public final void setSource(int source) { 1754 nativeSetSource(mNativePtr, source); 1755 } 1756 1757 /** 1758 * Return the kind of action being performed. 1759 * Consider using {@link #getActionMasked} and {@link #getActionIndex} to retrieve 1760 * the separate masked action and pointer index. 1761 * @return The action, such as {@link #ACTION_DOWN} or 1762 * the combination of {@link #ACTION_POINTER_DOWN} with a shifted pointer index. 1763 */ getAction()1764 public final int getAction() { 1765 return nativeGetAction(mNativePtr); 1766 } 1767 1768 /** 1769 * Return the masked action being performed, without pointer index information. 1770 * Use {@link #getActionIndex} to return the index associated with pointer actions. 1771 * @return The action, such as {@link #ACTION_DOWN} or {@link #ACTION_POINTER_DOWN}. 1772 */ getActionMasked()1773 public final int getActionMasked() { 1774 return nativeGetAction(mNativePtr) & ACTION_MASK; 1775 } 1776 1777 /** 1778 * For {@link #ACTION_POINTER_DOWN} or {@link #ACTION_POINTER_UP} 1779 * as returned by {@link #getActionMasked}, this returns the associated 1780 * pointer index. 1781 * The index may be used with {@link #getPointerId(int)}, 1782 * {@link #getX(int)}, {@link #getY(int)}, {@link #getPressure(int)}, 1783 * and {@link #getSize(int)} to get information about the pointer that has 1784 * gone down or up. 1785 * @return The index associated with the action. 1786 */ getActionIndex()1787 public final int getActionIndex() { 1788 return (nativeGetAction(mNativePtr) & ACTION_POINTER_INDEX_MASK) 1789 >> ACTION_POINTER_INDEX_SHIFT; 1790 } 1791 1792 /** 1793 * Returns true if this motion event is a touch event. 1794 * <p> 1795 * Specifically excludes pointer events with action {@link #ACTION_HOVER_MOVE}, 1796 * {@link #ACTION_HOVER_ENTER}, {@link #ACTION_HOVER_EXIT}, or {@link #ACTION_SCROLL} 1797 * because they are not actually touch events (the pointer is not down). 1798 * </p> 1799 * @return True if this motion event is a touch event. 1800 * @hide 1801 */ isTouchEvent()1802 public final boolean isTouchEvent() { 1803 return nativeIsTouchEvent(mNativePtr); 1804 } 1805 1806 /** 1807 * Gets the motion event flags. 1808 * 1809 * @see #FLAG_WINDOW_IS_OBSCURED 1810 */ getFlags()1811 public final int getFlags() { 1812 return nativeGetFlags(mNativePtr); 1813 } 1814 1815 /** @hide */ 1816 @Override isTainted()1817 public final boolean isTainted() { 1818 final int flags = getFlags(); 1819 return (flags & FLAG_TAINTED) != 0; 1820 } 1821 1822 /** @hide */ 1823 @Override setTainted(boolean tainted)1824 public final void setTainted(boolean tainted) { 1825 final int flags = getFlags(); 1826 nativeSetFlags(mNativePtr, tainted ? flags | FLAG_TAINTED : flags & ~FLAG_TAINTED); 1827 } 1828 1829 /** @hide */ isTargetAccessibilityFocus()1830 public final boolean isTargetAccessibilityFocus() { 1831 final int flags = getFlags(); 1832 return (flags & FLAG_TARGET_ACCESSIBILITY_FOCUS) != 0; 1833 } 1834 1835 /** @hide */ setTargetAccessibilityFocus(boolean targetsFocus)1836 public final void setTargetAccessibilityFocus(boolean targetsFocus) { 1837 final int flags = getFlags(); 1838 nativeSetFlags(mNativePtr, targetsFocus 1839 ? flags | FLAG_TARGET_ACCESSIBILITY_FOCUS 1840 : flags & ~FLAG_TARGET_ACCESSIBILITY_FOCUS); 1841 } 1842 1843 /** 1844 * Returns the time (in ms) when the user originally pressed down to start 1845 * a stream of position events. 1846 */ getDownTime()1847 public final long getDownTime() { 1848 return nativeGetDownTimeNanos(mNativePtr) / NS_PER_MS; 1849 } 1850 1851 /** 1852 * Sets the time (in ms) when the user originally pressed down to start 1853 * a stream of position events. 1854 * 1855 * @hide 1856 */ setDownTime(long downTime)1857 public final void setDownTime(long downTime) { 1858 nativeSetDownTimeNanos(mNativePtr, downTime * NS_PER_MS); 1859 } 1860 1861 /** 1862 * Retrieve the time this event occurred, 1863 * in the {@link android.os.SystemClock#uptimeMillis} time base. 1864 * 1865 * @return Returns the time this event occurred, 1866 * in the {@link android.os.SystemClock#uptimeMillis} time base. 1867 */ 1868 @Override getEventTime()1869 public final long getEventTime() { 1870 return nativeGetEventTimeNanos(mNativePtr, HISTORY_CURRENT) / NS_PER_MS; 1871 } 1872 1873 /** 1874 * Retrieve the time this event occurred, 1875 * in the {@link android.os.SystemClock#uptimeMillis} time base but with 1876 * nanosecond precision. 1877 * <p> 1878 * The value is in nanosecond precision but it may not have nanosecond accuracy. 1879 * </p> 1880 * 1881 * @return Returns the time this event occurred, 1882 * in the {@link android.os.SystemClock#uptimeMillis} time base but with 1883 * nanosecond precision. 1884 * 1885 * @hide 1886 */ 1887 @Override getEventTimeNano()1888 public final long getEventTimeNano() { 1889 return nativeGetEventTimeNanos(mNativePtr, HISTORY_CURRENT); 1890 } 1891 1892 /** 1893 * {@link #getX(int)} for the first pointer index (may be an 1894 * arbitrary pointer identifier). 1895 * 1896 * @see #AXIS_X 1897 */ getX()1898 public final float getX() { 1899 return nativeGetAxisValue(mNativePtr, AXIS_X, 0, HISTORY_CURRENT); 1900 } 1901 1902 /** 1903 * {@link #getY(int)} for the first pointer index (may be an 1904 * arbitrary pointer identifier). 1905 * 1906 * @see #AXIS_Y 1907 */ getY()1908 public final float getY() { 1909 return nativeGetAxisValue(mNativePtr, AXIS_Y, 0, HISTORY_CURRENT); 1910 } 1911 1912 /** 1913 * {@link #getPressure(int)} for the first pointer index (may be an 1914 * arbitrary pointer identifier). 1915 * 1916 * @see #AXIS_PRESSURE 1917 */ getPressure()1918 public final float getPressure() { 1919 return nativeGetAxisValue(mNativePtr, AXIS_PRESSURE, 0, HISTORY_CURRENT); 1920 } 1921 1922 /** 1923 * {@link #getSize(int)} for the first pointer index (may be an 1924 * arbitrary pointer identifier). 1925 * 1926 * @see #AXIS_SIZE 1927 */ getSize()1928 public final float getSize() { 1929 return nativeGetAxisValue(mNativePtr, AXIS_SIZE, 0, HISTORY_CURRENT); 1930 } 1931 1932 /** 1933 * {@link #getTouchMajor(int)} for the first pointer index (may be an 1934 * arbitrary pointer identifier). 1935 * 1936 * @see #AXIS_TOUCH_MAJOR 1937 */ getTouchMajor()1938 public final float getTouchMajor() { 1939 return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MAJOR, 0, HISTORY_CURRENT); 1940 } 1941 1942 /** 1943 * {@link #getTouchMinor(int)} for the first pointer index (may be an 1944 * arbitrary pointer identifier). 1945 * 1946 * @see #AXIS_TOUCH_MINOR 1947 */ getTouchMinor()1948 public final float getTouchMinor() { 1949 return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MINOR, 0, HISTORY_CURRENT); 1950 } 1951 1952 /** 1953 * {@link #getToolMajor(int)} for the first pointer index (may be an 1954 * arbitrary pointer identifier). 1955 * 1956 * @see #AXIS_TOOL_MAJOR 1957 */ getToolMajor()1958 public final float getToolMajor() { 1959 return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MAJOR, 0, HISTORY_CURRENT); 1960 } 1961 1962 /** 1963 * {@link #getToolMinor(int)} for the first pointer index (may be an 1964 * arbitrary pointer identifier). 1965 * 1966 * @see #AXIS_TOOL_MINOR 1967 */ getToolMinor()1968 public final float getToolMinor() { 1969 return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MINOR, 0, HISTORY_CURRENT); 1970 } 1971 1972 /** 1973 * {@link #getOrientation(int)} for the first pointer index (may be an 1974 * arbitrary pointer identifier). 1975 * 1976 * @see #AXIS_ORIENTATION 1977 */ getOrientation()1978 public final float getOrientation() { 1979 return nativeGetAxisValue(mNativePtr, AXIS_ORIENTATION, 0, HISTORY_CURRENT); 1980 } 1981 1982 /** 1983 * {@link #getAxisValue(int)} for the first pointer index (may be an 1984 * arbitrary pointer identifier). 1985 * 1986 * @param axis The axis identifier for the axis value to retrieve. 1987 * 1988 * @see #AXIS_X 1989 * @see #AXIS_Y 1990 */ getAxisValue(int axis)1991 public final float getAxisValue(int axis) { 1992 return nativeGetAxisValue(mNativePtr, axis, 0, HISTORY_CURRENT); 1993 } 1994 1995 /** 1996 * The number of pointers of data contained in this event. Always 1997 * >= 1. 1998 */ getPointerCount()1999 public final int getPointerCount() { 2000 return nativeGetPointerCount(mNativePtr); 2001 } 2002 2003 /** 2004 * Return the pointer identifier associated with a particular pointer 2005 * data index is this event. The identifier tells you the actual pointer 2006 * number associated with the data, accounting for individual pointers 2007 * going up and down since the start of the current gesture. 2008 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2009 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2010 */ getPointerId(int pointerIndex)2011 public final int getPointerId(int pointerIndex) { 2012 return nativeGetPointerId(mNativePtr, pointerIndex); 2013 } 2014 2015 /** 2016 * Gets the tool type of a pointer for the given pointer index. 2017 * The tool type indicates the type of tool used to make contact such 2018 * as a finger or stylus, if known. 2019 * 2020 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2021 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2022 * @return The tool type of the pointer. 2023 * 2024 * @see #TOOL_TYPE_UNKNOWN 2025 * @see #TOOL_TYPE_FINGER 2026 * @see #TOOL_TYPE_STYLUS 2027 * @see #TOOL_TYPE_MOUSE 2028 */ getToolType(int pointerIndex)2029 public final int getToolType(int pointerIndex) { 2030 return nativeGetToolType(mNativePtr, pointerIndex); 2031 } 2032 2033 /** 2034 * Given a pointer identifier, find the index of its data in the event. 2035 * 2036 * @param pointerId The identifier of the pointer to be found. 2037 * @return Returns either the index of the pointer (for use with 2038 * {@link #getX(int)} et al.), or -1 if there is no data available for 2039 * that pointer identifier. 2040 */ findPointerIndex(int pointerId)2041 public final int findPointerIndex(int pointerId) { 2042 return nativeFindPointerIndex(mNativePtr, pointerId); 2043 } 2044 2045 /** 2046 * Returns the X coordinate of this event for the given pointer 2047 * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2048 * identifier for this index). 2049 * Whole numbers are pixels; the 2050 * value may have a fraction for input devices that are sub-pixel precise. 2051 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2052 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2053 * 2054 * @see #AXIS_X 2055 */ getX(int pointerIndex)2056 public final float getX(int pointerIndex) { 2057 return nativeGetAxisValue(mNativePtr, AXIS_X, pointerIndex, HISTORY_CURRENT); 2058 } 2059 2060 /** 2061 * Returns the Y coordinate of this event for the given pointer 2062 * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2063 * identifier for this index). 2064 * Whole numbers are pixels; the 2065 * value may have a fraction for input devices that are sub-pixel precise. 2066 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2067 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2068 * 2069 * @see #AXIS_Y 2070 */ getY(int pointerIndex)2071 public final float getY(int pointerIndex) { 2072 return nativeGetAxisValue(mNativePtr, AXIS_Y, pointerIndex, HISTORY_CURRENT); 2073 } 2074 2075 /** 2076 * Returns the current pressure of this event for the given pointer 2077 * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2078 * identifier for this index). 2079 * The pressure generally 2080 * ranges from 0 (no pressure at all) to 1 (normal pressure), however 2081 * values higher than 1 may be generated depending on the calibration of 2082 * the input device. 2083 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2084 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2085 * 2086 * @see #AXIS_PRESSURE 2087 */ getPressure(int pointerIndex)2088 public final float getPressure(int pointerIndex) { 2089 return nativeGetAxisValue(mNativePtr, AXIS_PRESSURE, pointerIndex, HISTORY_CURRENT); 2090 } 2091 2092 /** 2093 * Returns a scaled value of the approximate size for the given pointer 2094 * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2095 * identifier for this index). 2096 * This represents some approximation of the area of the screen being 2097 * pressed; the actual value in pixels corresponding to the 2098 * touch is normalized with the device specific range of values 2099 * and scaled to a value between 0 and 1. The value of size can be used to 2100 * determine fat touch events. 2101 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2102 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2103 * 2104 * @see #AXIS_SIZE 2105 */ getSize(int pointerIndex)2106 public final float getSize(int pointerIndex) { 2107 return nativeGetAxisValue(mNativePtr, AXIS_SIZE, pointerIndex, HISTORY_CURRENT); 2108 } 2109 2110 /** 2111 * Returns the length of the major axis of an ellipse that describes the touch 2112 * area at the point of contact for the given pointer 2113 * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2114 * identifier for this index). 2115 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2116 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2117 * 2118 * @see #AXIS_TOUCH_MAJOR 2119 */ getTouchMajor(int pointerIndex)2120 public final float getTouchMajor(int pointerIndex) { 2121 return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MAJOR, pointerIndex, HISTORY_CURRENT); 2122 } 2123 2124 /** 2125 * Returns the length of the minor axis of an ellipse that describes the touch 2126 * area at the point of contact for the given pointer 2127 * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2128 * identifier for this index). 2129 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2130 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2131 * 2132 * @see #AXIS_TOUCH_MINOR 2133 */ getTouchMinor(int pointerIndex)2134 public final float getTouchMinor(int pointerIndex) { 2135 return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MINOR, pointerIndex, HISTORY_CURRENT); 2136 } 2137 2138 /** 2139 * Returns the length of the major axis of an ellipse that describes the size of 2140 * the approaching tool for the given pointer 2141 * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2142 * identifier for this index). 2143 * The tool area represents the estimated size of the finger or pen that is 2144 * touching the device independent of its actual touch area at the point of contact. 2145 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2146 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2147 * 2148 * @see #AXIS_TOOL_MAJOR 2149 */ getToolMajor(int pointerIndex)2150 public final float getToolMajor(int pointerIndex) { 2151 return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MAJOR, pointerIndex, HISTORY_CURRENT); 2152 } 2153 2154 /** 2155 * Returns the length of the minor axis of an ellipse that describes the size of 2156 * the approaching tool for the given pointer 2157 * <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2158 * identifier for this index). 2159 * The tool area represents the estimated size of the finger or pen that is 2160 * touching the device independent of its actual touch area at the point of contact. 2161 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2162 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2163 * 2164 * @see #AXIS_TOOL_MINOR 2165 */ getToolMinor(int pointerIndex)2166 public final float getToolMinor(int pointerIndex) { 2167 return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MINOR, pointerIndex, HISTORY_CURRENT); 2168 } 2169 2170 /** 2171 * Returns the orientation of the touch area and tool area in radians clockwise from vertical 2172 * for the given pointer <em>index</em> (use {@link #getPointerId(int)} to find the pointer 2173 * identifier for this index). 2174 * An angle of 0 radians indicates that the major axis of contact is oriented 2175 * upwards, is perfectly circular or is of unknown orientation. A positive angle 2176 * indicates that the major axis of contact is oriented to the right. A negative angle 2177 * indicates that the major axis of contact is oriented to the left. 2178 * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians 2179 * (finger pointing fully right). 2180 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2181 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2182 * 2183 * @see #AXIS_ORIENTATION 2184 */ getOrientation(int pointerIndex)2185 public final float getOrientation(int pointerIndex) { 2186 return nativeGetAxisValue(mNativePtr, AXIS_ORIENTATION, pointerIndex, HISTORY_CURRENT); 2187 } 2188 2189 /** 2190 * Returns the value of the requested axis for the given pointer <em>index</em> 2191 * (use {@link #getPointerId(int)} to find the pointer identifier for this index). 2192 * 2193 * @param axis The axis identifier for the axis value to retrieve. 2194 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2195 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2196 * @return The value of the axis, or 0 if the axis is not available. 2197 * 2198 * @see #AXIS_X 2199 * @see #AXIS_Y 2200 */ getAxisValue(int axis, int pointerIndex)2201 public final float getAxisValue(int axis, int pointerIndex) { 2202 return nativeGetAxisValue(mNativePtr, axis, pointerIndex, HISTORY_CURRENT); 2203 } 2204 2205 /** 2206 * Populates a {@link PointerCoords} object with pointer coordinate data for 2207 * the specified pointer index. 2208 * 2209 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2210 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2211 * @param outPointerCoords The pointer coordinate object to populate. 2212 * 2213 * @see PointerCoords 2214 */ getPointerCoords(int pointerIndex, PointerCoords outPointerCoords)2215 public final void getPointerCoords(int pointerIndex, PointerCoords outPointerCoords) { 2216 nativeGetPointerCoords(mNativePtr, pointerIndex, HISTORY_CURRENT, outPointerCoords); 2217 } 2218 2219 /** 2220 * Populates a {@link PointerProperties} object with pointer properties for 2221 * the specified pointer index. 2222 * 2223 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2224 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2225 * @param outPointerProperties The pointer properties object to populate. 2226 * 2227 * @see PointerProperties 2228 */ getPointerProperties(int pointerIndex, PointerProperties outPointerProperties)2229 public final void getPointerProperties(int pointerIndex, 2230 PointerProperties outPointerProperties) { 2231 nativeGetPointerProperties(mNativePtr, pointerIndex, outPointerProperties); 2232 } 2233 2234 /** 2235 * Returns the state of any meta / modifier keys that were in effect when 2236 * the event was generated. This is the same values as those 2237 * returned by {@link KeyEvent#getMetaState() KeyEvent.getMetaState}. 2238 * 2239 * @return an integer in which each bit set to 1 represents a pressed 2240 * meta key 2241 * 2242 * @see KeyEvent#getMetaState() 2243 */ getMetaState()2244 public final int getMetaState() { 2245 return nativeGetMetaState(mNativePtr); 2246 } 2247 2248 /** 2249 * Gets the state of all buttons that are pressed such as a mouse or stylus button. 2250 * 2251 * @return The button state. 2252 * 2253 * @see #BUTTON_PRIMARY 2254 * @see #BUTTON_SECONDARY 2255 * @see #BUTTON_TERTIARY 2256 * @see #BUTTON_FORWARD 2257 * @see #BUTTON_BACK 2258 * @see #BUTTON_STYLUS_PRIMARY 2259 * @see #BUTTON_STYLUS_SECONDARY 2260 */ getButtonState()2261 public final int getButtonState() { 2262 return nativeGetButtonState(mNativePtr); 2263 } 2264 2265 /** 2266 * Sets the bitfield indicating which buttons are pressed. 2267 * 2268 * @see #getButtonState() 2269 * @hide 2270 */ setButtonState(int buttonState)2271 public final void setButtonState(int buttonState) { 2272 nativeSetButtonState(mNativePtr, buttonState); 2273 } 2274 2275 /** 2276 * Gets which button has been modified during a press or release action. 2277 * 2278 * For actions other than {@link #ACTION_BUTTON_PRESS} and {@link #ACTION_BUTTON_RELEASE} 2279 * the returned value is undefined. 2280 * 2281 * @see #getButtonState() 2282 */ getActionButton()2283 public final int getActionButton() { 2284 return nativeGetActionButton(mNativePtr); 2285 } 2286 2287 /** 2288 * Sets the action button for the event. 2289 * 2290 * @see #getActionButton() 2291 * @hide 2292 */ setActionButton(int button)2293 public final void setActionButton(int button) { 2294 nativeSetActionButton(mNativePtr, button); 2295 } 2296 2297 /** 2298 * Returns the original raw X coordinate of this event. For touch 2299 * events on the screen, this is the original location of the event 2300 * on the screen, before it had been adjusted for the containing window 2301 * and views. 2302 * 2303 * @see #getX(int) 2304 * @see #AXIS_X 2305 */ getRawX()2306 public final float getRawX() { 2307 return nativeGetRawAxisValue(mNativePtr, AXIS_X, 0, HISTORY_CURRENT); 2308 } 2309 2310 /** 2311 * Returns the original raw Y coordinate of this event. For touch 2312 * events on the screen, this is the original location of the event 2313 * on the screen, before it had been adjusted for the containing window 2314 * and views. 2315 * 2316 * @see #getY(int) 2317 * @see #AXIS_Y 2318 */ getRawY()2319 public final float getRawY() { 2320 return nativeGetRawAxisValue(mNativePtr, AXIS_Y, 0, HISTORY_CURRENT); 2321 } 2322 2323 /** 2324 * Return the precision of the X coordinates being reported. You can 2325 * multiply this number with {@link #getX} to find the actual hardware 2326 * value of the X coordinate. 2327 * @return Returns the precision of X coordinates being reported. 2328 * 2329 * @see #AXIS_X 2330 */ getXPrecision()2331 public final float getXPrecision() { 2332 return nativeGetXPrecision(mNativePtr); 2333 } 2334 2335 /** 2336 * Return the precision of the Y coordinates being reported. You can 2337 * multiply this number with {@link #getY} to find the actual hardware 2338 * value of the Y coordinate. 2339 * @return Returns the precision of Y coordinates being reported. 2340 * 2341 * @see #AXIS_Y 2342 */ getYPrecision()2343 public final float getYPrecision() { 2344 return nativeGetYPrecision(mNativePtr); 2345 } 2346 2347 /** 2348 * Returns the number of historical points in this event. These are 2349 * movements that have occurred between this event and the previous event. 2350 * This only applies to ACTION_MOVE events -- all other actions will have 2351 * a size of 0. 2352 * 2353 * @return Returns the number of historical points in the event. 2354 */ getHistorySize()2355 public final int getHistorySize() { 2356 return nativeGetHistorySize(mNativePtr); 2357 } 2358 2359 /** 2360 * Returns the time that a historical movement occurred between this event 2361 * and the previous event, in the {@link android.os.SystemClock#uptimeMillis} time base. 2362 * <p> 2363 * This only applies to ACTION_MOVE events. 2364 * </p> 2365 * 2366 * @param pos Which historical value to return; must be less than 2367 * {@link #getHistorySize} 2368 * @return Returns the time that a historical movement occurred between this 2369 * event and the previous event, 2370 * in the {@link android.os.SystemClock#uptimeMillis} time base. 2371 * 2372 * @see #getHistorySize 2373 * @see #getEventTime 2374 */ getHistoricalEventTime(int pos)2375 public final long getHistoricalEventTime(int pos) { 2376 return nativeGetEventTimeNanos(mNativePtr, pos) / NS_PER_MS; 2377 } 2378 2379 /** 2380 * Returns the time that a historical movement occurred between this event 2381 * and the previous event, in the {@link android.os.SystemClock#uptimeMillis} time base 2382 * but with nanosecond (instead of millisecond) precision. 2383 * <p> 2384 * This only applies to ACTION_MOVE events. 2385 * </p><p> 2386 * The value is in nanosecond precision but it may not have nanosecond accuracy. 2387 * </p> 2388 * 2389 * @param pos Which historical value to return; must be less than 2390 * {@link #getHistorySize} 2391 * @return Returns the time that a historical movement occurred between this 2392 * event and the previous event, 2393 * in the {@link android.os.SystemClock#uptimeMillis} time base but with 2394 * nanosecond (instead of millisecond) precision. 2395 * 2396 * @see #getHistorySize 2397 * @see #getEventTime 2398 * 2399 * @hide 2400 */ getHistoricalEventTimeNano(int pos)2401 public final long getHistoricalEventTimeNano(int pos) { 2402 return nativeGetEventTimeNanos(mNativePtr, pos); 2403 } 2404 2405 /** 2406 * {@link #getHistoricalX(int, int)} for the first pointer index (may be an 2407 * arbitrary pointer identifier). 2408 * 2409 * @param pos Which historical value to return; must be less than 2410 * {@link #getHistorySize} 2411 * 2412 * @see #getHistorySize 2413 * @see #getX() 2414 * @see #AXIS_X 2415 */ getHistoricalX(int pos)2416 public final float getHistoricalX(int pos) { 2417 return nativeGetAxisValue(mNativePtr, AXIS_X, 0, pos); 2418 } 2419 2420 /** 2421 * {@link #getHistoricalY(int, int)} for the first pointer index (may be an 2422 * arbitrary pointer identifier). 2423 * 2424 * @param pos Which historical value to return; must be less than 2425 * {@link #getHistorySize} 2426 * 2427 * @see #getHistorySize 2428 * @see #getY() 2429 * @see #AXIS_Y 2430 */ getHistoricalY(int pos)2431 public final float getHistoricalY(int pos) { 2432 return nativeGetAxisValue(mNativePtr, AXIS_Y, 0, pos); 2433 } 2434 2435 /** 2436 * {@link #getHistoricalPressure(int, int)} for the first pointer index (may be an 2437 * arbitrary pointer identifier). 2438 * 2439 * @param pos Which historical value to return; must be less than 2440 * {@link #getHistorySize} 2441 * 2442 * @see #getHistorySize 2443 * @see #getPressure() 2444 * @see #AXIS_PRESSURE 2445 */ getHistoricalPressure(int pos)2446 public final float getHistoricalPressure(int pos) { 2447 return nativeGetAxisValue(mNativePtr, AXIS_PRESSURE, 0, pos); 2448 } 2449 2450 /** 2451 * {@link #getHistoricalSize(int, int)} for the first pointer index (may be an 2452 * arbitrary pointer identifier). 2453 * 2454 * @param pos Which historical value to return; must be less than 2455 * {@link #getHistorySize} 2456 * 2457 * @see #getHistorySize 2458 * @see #getSize() 2459 * @see #AXIS_SIZE 2460 */ getHistoricalSize(int pos)2461 public final float getHistoricalSize(int pos) { 2462 return nativeGetAxisValue(mNativePtr, AXIS_SIZE, 0, pos); 2463 } 2464 2465 /** 2466 * {@link #getHistoricalTouchMajor(int, int)} for the first pointer index (may be an 2467 * arbitrary pointer identifier). 2468 * 2469 * @param pos Which historical value to return; must be less than 2470 * {@link #getHistorySize} 2471 * 2472 * @see #getHistorySize 2473 * @see #getTouchMajor() 2474 * @see #AXIS_TOUCH_MAJOR 2475 */ getHistoricalTouchMajor(int pos)2476 public final float getHistoricalTouchMajor(int pos) { 2477 return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MAJOR, 0, pos); 2478 } 2479 2480 /** 2481 * {@link #getHistoricalTouchMinor(int, int)} for the first pointer index (may be an 2482 * arbitrary pointer identifier). 2483 * 2484 * @param pos Which historical value to return; must be less than 2485 * {@link #getHistorySize} 2486 * 2487 * @see #getHistorySize 2488 * @see #getTouchMinor() 2489 * @see #AXIS_TOUCH_MINOR 2490 */ getHistoricalTouchMinor(int pos)2491 public final float getHistoricalTouchMinor(int pos) { 2492 return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MINOR, 0, pos); 2493 } 2494 2495 /** 2496 * {@link #getHistoricalToolMajor(int, int)} for the first pointer index (may be an 2497 * arbitrary pointer identifier). 2498 * 2499 * @param pos Which historical value to return; must be less than 2500 * {@link #getHistorySize} 2501 * 2502 * @see #getHistorySize 2503 * @see #getToolMajor() 2504 * @see #AXIS_TOOL_MAJOR 2505 */ getHistoricalToolMajor(int pos)2506 public final float getHistoricalToolMajor(int pos) { 2507 return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MAJOR, 0, pos); 2508 } 2509 2510 /** 2511 * {@link #getHistoricalToolMinor(int, int)} for the first pointer index (may be an 2512 * arbitrary pointer identifier). 2513 * 2514 * @param pos Which historical value to return; must be less than 2515 * {@link #getHistorySize} 2516 * 2517 * @see #getHistorySize 2518 * @see #getToolMinor() 2519 * @see #AXIS_TOOL_MINOR 2520 */ getHistoricalToolMinor(int pos)2521 public final float getHistoricalToolMinor(int pos) { 2522 return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MINOR, 0, pos); 2523 } 2524 2525 /** 2526 * {@link #getHistoricalOrientation(int, int)} for the first pointer index (may be an 2527 * arbitrary pointer identifier). 2528 * 2529 * @param pos Which historical value to return; must be less than 2530 * {@link #getHistorySize} 2531 * 2532 * @see #getHistorySize 2533 * @see #getOrientation() 2534 * @see #AXIS_ORIENTATION 2535 */ getHistoricalOrientation(int pos)2536 public final float getHistoricalOrientation(int pos) { 2537 return nativeGetAxisValue(mNativePtr, AXIS_ORIENTATION, 0, pos); 2538 } 2539 2540 /** 2541 * {@link #getHistoricalAxisValue(int, int, int)} for the first pointer index (may be an 2542 * arbitrary pointer identifier). 2543 * 2544 * @param axis The axis identifier for the axis value to retrieve. 2545 * @param pos Which historical value to return; must be less than 2546 * {@link #getHistorySize} 2547 * 2548 * @see #getHistorySize 2549 * @see #getAxisValue(int) 2550 * @see #AXIS_X 2551 * @see #AXIS_Y 2552 */ getHistoricalAxisValue(int axis, int pos)2553 public final float getHistoricalAxisValue(int axis, int pos) { 2554 return nativeGetAxisValue(mNativePtr, axis, 0, pos); 2555 } 2556 2557 /** 2558 * Returns a historical X coordinate, as per {@link #getX(int)}, that 2559 * occurred between this event and the previous event for the given pointer. 2560 * Only applies to ACTION_MOVE events. 2561 * 2562 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2563 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2564 * @param pos Which historical value to return; must be less than 2565 * {@link #getHistorySize} 2566 * 2567 * @see #getHistorySize 2568 * @see #getX(int) 2569 * @see #AXIS_X 2570 */ getHistoricalX(int pointerIndex, int pos)2571 public final float getHistoricalX(int pointerIndex, int pos) { 2572 return nativeGetAxisValue(mNativePtr, AXIS_X, pointerIndex, pos); 2573 } 2574 2575 /** 2576 * Returns a historical Y coordinate, as per {@link #getY(int)}, that 2577 * occurred between this event and the previous event for the given pointer. 2578 * Only applies to ACTION_MOVE events. 2579 * 2580 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2581 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2582 * @param pos Which historical value to return; must be less than 2583 * {@link #getHistorySize} 2584 * 2585 * @see #getHistorySize 2586 * @see #getY(int) 2587 * @see #AXIS_Y 2588 */ getHistoricalY(int pointerIndex, int pos)2589 public final float getHistoricalY(int pointerIndex, int pos) { 2590 return nativeGetAxisValue(mNativePtr, AXIS_Y, pointerIndex, pos); 2591 } 2592 2593 /** 2594 * Returns a historical pressure coordinate, as per {@link #getPressure(int)}, 2595 * that occurred between this event and the previous event for the given 2596 * pointer. Only applies to ACTION_MOVE events. 2597 * 2598 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2599 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2600 * @param pos Which historical value to return; must be less than 2601 * {@link #getHistorySize} 2602 * 2603 * @see #getHistorySize 2604 * @see #getPressure(int) 2605 * @see #AXIS_PRESSURE 2606 */ getHistoricalPressure(int pointerIndex, int pos)2607 public final float getHistoricalPressure(int pointerIndex, int pos) { 2608 return nativeGetAxisValue(mNativePtr, AXIS_PRESSURE, pointerIndex, pos); 2609 } 2610 2611 /** 2612 * Returns a historical size coordinate, as per {@link #getSize(int)}, that 2613 * occurred between this event and the previous event for the given pointer. 2614 * Only applies to ACTION_MOVE events. 2615 * 2616 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2617 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2618 * @param pos Which historical value to return; must be less than 2619 * {@link #getHistorySize} 2620 * 2621 * @see #getHistorySize 2622 * @see #getSize(int) 2623 * @see #AXIS_SIZE 2624 */ getHistoricalSize(int pointerIndex, int pos)2625 public final float getHistoricalSize(int pointerIndex, int pos) { 2626 return nativeGetAxisValue(mNativePtr, AXIS_SIZE, pointerIndex, pos); 2627 } 2628 2629 /** 2630 * Returns a historical touch major axis coordinate, as per {@link #getTouchMajor(int)}, that 2631 * occurred between this event and the previous event for the given pointer. 2632 * Only applies to ACTION_MOVE events. 2633 * 2634 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2635 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2636 * @param pos Which historical value to return; must be less than 2637 * {@link #getHistorySize} 2638 * 2639 * @see #getHistorySize 2640 * @see #getTouchMajor(int) 2641 * @see #AXIS_TOUCH_MAJOR 2642 */ getHistoricalTouchMajor(int pointerIndex, int pos)2643 public final float getHistoricalTouchMajor(int pointerIndex, int pos) { 2644 return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MAJOR, pointerIndex, pos); 2645 } 2646 2647 /** 2648 * Returns a historical touch minor axis coordinate, as per {@link #getTouchMinor(int)}, that 2649 * occurred between this event and the previous event for the given pointer. 2650 * Only applies to ACTION_MOVE events. 2651 * 2652 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2653 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2654 * @param pos Which historical value to return; must be less than 2655 * {@link #getHistorySize} 2656 * 2657 * @see #getHistorySize 2658 * @see #getTouchMinor(int) 2659 * @see #AXIS_TOUCH_MINOR 2660 */ getHistoricalTouchMinor(int pointerIndex, int pos)2661 public final float getHistoricalTouchMinor(int pointerIndex, int pos) { 2662 return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MINOR, pointerIndex, pos); 2663 } 2664 2665 /** 2666 * Returns a historical tool major axis coordinate, as per {@link #getToolMajor(int)}, that 2667 * occurred between this event and the previous event for the given pointer. 2668 * Only applies to ACTION_MOVE events. 2669 * 2670 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2671 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2672 * @param pos Which historical value to return; must be less than 2673 * {@link #getHistorySize} 2674 * 2675 * @see #getHistorySize 2676 * @see #getToolMajor(int) 2677 * @see #AXIS_TOOL_MAJOR 2678 */ getHistoricalToolMajor(int pointerIndex, int pos)2679 public final float getHistoricalToolMajor(int pointerIndex, int pos) { 2680 return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MAJOR, pointerIndex, pos); 2681 } 2682 2683 /** 2684 * Returns a historical tool minor axis coordinate, as per {@link #getToolMinor(int)}, that 2685 * occurred between this event and the previous event for the given pointer. 2686 * Only applies to ACTION_MOVE events. 2687 * 2688 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2689 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2690 * @param pos Which historical value to return; must be less than 2691 * {@link #getHistorySize} 2692 * 2693 * @see #getHistorySize 2694 * @see #getToolMinor(int) 2695 * @see #AXIS_TOOL_MINOR 2696 */ getHistoricalToolMinor(int pointerIndex, int pos)2697 public final float getHistoricalToolMinor(int pointerIndex, int pos) { 2698 return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MINOR, pointerIndex, pos); 2699 } 2700 2701 /** 2702 * Returns a historical orientation coordinate, as per {@link #getOrientation(int)}, that 2703 * occurred between this event and the previous event for the given pointer. 2704 * Only applies to ACTION_MOVE events. 2705 * 2706 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2707 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2708 * @param pos Which historical value to return; must be less than 2709 * {@link #getHistorySize} 2710 * 2711 * @see #getHistorySize 2712 * @see #getOrientation(int) 2713 * @see #AXIS_ORIENTATION 2714 */ getHistoricalOrientation(int pointerIndex, int pos)2715 public final float getHistoricalOrientation(int pointerIndex, int pos) { 2716 return nativeGetAxisValue(mNativePtr, AXIS_ORIENTATION, pointerIndex, pos); 2717 } 2718 2719 /** 2720 * Returns the historical value of the requested axis, as per {@link #getAxisValue(int, int)}, 2721 * occurred between this event and the previous event for the given pointer. 2722 * Only applies to ACTION_MOVE events. 2723 * 2724 * @param axis The axis identifier for the axis value to retrieve. 2725 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2726 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2727 * @param pos Which historical value to return; must be less than 2728 * {@link #getHistorySize} 2729 * @return The value of the axis, or 0 if the axis is not available. 2730 * 2731 * @see #AXIS_X 2732 * @see #AXIS_Y 2733 */ getHistoricalAxisValue(int axis, int pointerIndex, int pos)2734 public final float getHistoricalAxisValue(int axis, int pointerIndex, int pos) { 2735 return nativeGetAxisValue(mNativePtr, axis, pointerIndex, pos); 2736 } 2737 2738 /** 2739 * Populates a {@link PointerCoords} object with historical pointer coordinate data, 2740 * as per {@link #getPointerCoords}, that occurred between this event and the previous 2741 * event for the given pointer. 2742 * Only applies to ACTION_MOVE events. 2743 * 2744 * @param pointerIndex Raw index of pointer to retrieve. Value may be from 0 2745 * (the first pointer that is down) to {@link #getPointerCount()}-1. 2746 * @param pos Which historical value to return; must be less than 2747 * {@link #getHistorySize} 2748 * @param outPointerCoords The pointer coordinate object to populate. 2749 * 2750 * @see #getHistorySize 2751 * @see #getPointerCoords 2752 * @see PointerCoords 2753 */ getHistoricalPointerCoords(int pointerIndex, int pos, PointerCoords outPointerCoords)2754 public final void getHistoricalPointerCoords(int pointerIndex, int pos, 2755 PointerCoords outPointerCoords) { 2756 nativeGetPointerCoords(mNativePtr, pointerIndex, pos, outPointerCoords); 2757 } 2758 2759 /** 2760 * Returns a bitfield indicating which edges, if any, were touched by this 2761 * MotionEvent. For touch events, clients can use this to determine if the 2762 * user's finger was touching the edge of the display. 2763 * 2764 * This property is only set for {@link #ACTION_DOWN} events. 2765 * 2766 * @see #EDGE_LEFT 2767 * @see #EDGE_TOP 2768 * @see #EDGE_RIGHT 2769 * @see #EDGE_BOTTOM 2770 */ getEdgeFlags()2771 public final int getEdgeFlags() { 2772 return nativeGetEdgeFlags(mNativePtr); 2773 } 2774 2775 /** 2776 * Sets the bitfield indicating which edges, if any, were touched by this 2777 * MotionEvent. 2778 * 2779 * @see #getEdgeFlags() 2780 */ setEdgeFlags(int flags)2781 public final void setEdgeFlags(int flags) { 2782 nativeSetEdgeFlags(mNativePtr, flags); 2783 } 2784 2785 /** 2786 * Sets this event's action. 2787 */ setAction(int action)2788 public final void setAction(int action) { 2789 nativeSetAction(mNativePtr, action); 2790 } 2791 2792 /** 2793 * Adjust this event's location. 2794 * @param deltaX Amount to add to the current X coordinate of the event. 2795 * @param deltaY Amount to add to the current Y coordinate of the event. 2796 */ offsetLocation(float deltaX, float deltaY)2797 public final void offsetLocation(float deltaX, float deltaY) { 2798 if (deltaX != 0.0f || deltaY != 0.0f) { 2799 nativeOffsetLocation(mNativePtr, deltaX, deltaY); 2800 } 2801 } 2802 2803 /** 2804 * Set this event's location. Applies {@link #offsetLocation} with a 2805 * delta from the current location to the given new location. 2806 * 2807 * @param x New absolute X location. 2808 * @param y New absolute Y location. 2809 */ setLocation(float x, float y)2810 public final void setLocation(float x, float y) { 2811 float oldX = getX(); 2812 float oldY = getY(); 2813 offsetLocation(x - oldX, y - oldY); 2814 } 2815 2816 /** 2817 * Applies a transformation matrix to all of the points in the event. 2818 * 2819 * @param matrix The transformation matrix to apply. 2820 */ transform(Matrix matrix)2821 public final void transform(Matrix matrix) { 2822 if (matrix == null) { 2823 throw new IllegalArgumentException("matrix must not be null"); 2824 } 2825 2826 nativeTransform(mNativePtr, matrix); 2827 } 2828 2829 /** 2830 * Add a new movement to the batch of movements in this event. The event's 2831 * current location, position and size is updated to the new values. 2832 * The current values in the event are added to a list of historical values. 2833 * 2834 * Only applies to {@link #ACTION_MOVE} or {@link #ACTION_HOVER_MOVE} events. 2835 * 2836 * @param eventTime The time stamp (in ms) for this data. 2837 * @param x The new X position. 2838 * @param y The new Y position. 2839 * @param pressure The new pressure. 2840 * @param size The new size. 2841 * @param metaState Meta key state. 2842 */ addBatch(long eventTime, float x, float y, float pressure, float size, int metaState)2843 public final void addBatch(long eventTime, float x, float y, 2844 float pressure, float size, int metaState) { 2845 synchronized (gSharedTempLock) { 2846 ensureSharedTempPointerCapacity(1); 2847 final PointerCoords[] pc = gSharedTempPointerCoords; 2848 pc[0].clear(); 2849 pc[0].x = x; 2850 pc[0].y = y; 2851 pc[0].pressure = pressure; 2852 pc[0].size = size; 2853 2854 nativeAddBatch(mNativePtr, eventTime * NS_PER_MS, pc, metaState); 2855 } 2856 } 2857 2858 /** 2859 * Add a new movement to the batch of movements in this event. The event's 2860 * current location, position and size is updated to the new values. 2861 * The current values in the event are added to a list of historical values. 2862 * 2863 * Only applies to {@link #ACTION_MOVE} or {@link #ACTION_HOVER_MOVE} events. 2864 * 2865 * @param eventTime The time stamp (in ms) for this data. 2866 * @param pointerCoords The new pointer coordinates. 2867 * @param metaState Meta key state. 2868 */ addBatch(long eventTime, PointerCoords[] pointerCoords, int metaState)2869 public final void addBatch(long eventTime, PointerCoords[] pointerCoords, int metaState) { 2870 nativeAddBatch(mNativePtr, eventTime * NS_PER_MS, pointerCoords, metaState); 2871 } 2872 2873 /** 2874 * Adds all of the movement samples of the specified event to this one if 2875 * it is compatible. To be compatible, the event must have the same device id, 2876 * source, action, flags, pointer count, pointer properties. 2877 * 2878 * Only applies to {@link #ACTION_MOVE} or {@link #ACTION_HOVER_MOVE} events. 2879 * 2880 * @param event The event whose movements samples should be added to this one 2881 * if possible. 2882 * @return True if batching was performed or false if batching was not possible. 2883 * @hide 2884 */ addBatch(MotionEvent event)2885 public final boolean addBatch(MotionEvent event) { 2886 final int action = nativeGetAction(mNativePtr); 2887 if (action != ACTION_MOVE && action != ACTION_HOVER_MOVE) { 2888 return false; 2889 } 2890 if (action != nativeGetAction(event.mNativePtr)) { 2891 return false; 2892 } 2893 2894 if (nativeGetDeviceId(mNativePtr) != nativeGetDeviceId(event.mNativePtr) 2895 || nativeGetSource(mNativePtr) != nativeGetSource(event.mNativePtr) 2896 || nativeGetFlags(mNativePtr) != nativeGetFlags(event.mNativePtr)) { 2897 return false; 2898 } 2899 2900 final int pointerCount = nativeGetPointerCount(mNativePtr); 2901 if (pointerCount != nativeGetPointerCount(event.mNativePtr)) { 2902 return false; 2903 } 2904 2905 synchronized (gSharedTempLock) { 2906 ensureSharedTempPointerCapacity(Math.max(pointerCount, 2)); 2907 final PointerProperties[] pp = gSharedTempPointerProperties; 2908 final PointerCoords[] pc = gSharedTempPointerCoords; 2909 2910 for (int i = 0; i < pointerCount; i++) { 2911 nativeGetPointerProperties(mNativePtr, i, pp[0]); 2912 nativeGetPointerProperties(event.mNativePtr, i, pp[1]); 2913 if (!pp[0].equals(pp[1])) { 2914 return false; 2915 } 2916 } 2917 2918 final int metaState = nativeGetMetaState(event.mNativePtr); 2919 final int historySize = nativeGetHistorySize(event.mNativePtr); 2920 for (int h = 0; h <= historySize; h++) { 2921 final int historyPos = (h == historySize ? HISTORY_CURRENT : h); 2922 2923 for (int i = 0; i < pointerCount; i++) { 2924 nativeGetPointerCoords(event.mNativePtr, i, historyPos, pc[i]); 2925 } 2926 2927 final long eventTimeNanos = nativeGetEventTimeNanos(event.mNativePtr, historyPos); 2928 nativeAddBatch(mNativePtr, eventTimeNanos, pc, metaState); 2929 } 2930 } 2931 return true; 2932 } 2933 2934 /** 2935 * Returns true if all points in the motion event are completely within the specified bounds. 2936 * @hide 2937 */ isWithinBoundsNoHistory(float left, float top, float right, float bottom)2938 public final boolean isWithinBoundsNoHistory(float left, float top, 2939 float right, float bottom) { 2940 final int pointerCount = nativeGetPointerCount(mNativePtr); 2941 for (int i = 0; i < pointerCount; i++) { 2942 final float x = nativeGetAxisValue(mNativePtr, AXIS_X, i, HISTORY_CURRENT); 2943 final float y = nativeGetAxisValue(mNativePtr, AXIS_Y, i, HISTORY_CURRENT); 2944 if (x < left || x > right || y < top || y > bottom) { 2945 return false; 2946 } 2947 } 2948 return true; 2949 } 2950 clamp(float value, float low, float high)2951 private static final float clamp(float value, float low, float high) { 2952 if (value < low) { 2953 return low; 2954 } else if (value > high) { 2955 return high; 2956 } 2957 return value; 2958 } 2959 2960 /** 2961 * Returns a new motion events whose points have been clamped to the specified bounds. 2962 * @hide 2963 */ clampNoHistory(float left, float top, float right, float bottom)2964 public final MotionEvent clampNoHistory(float left, float top, float right, float bottom) { 2965 MotionEvent ev = obtain(); 2966 synchronized (gSharedTempLock) { 2967 final int pointerCount = nativeGetPointerCount(mNativePtr); 2968 2969 ensureSharedTempPointerCapacity(pointerCount); 2970 final PointerProperties[] pp = gSharedTempPointerProperties; 2971 final PointerCoords[] pc = gSharedTempPointerCoords; 2972 2973 for (int i = 0; i < pointerCount; i++) { 2974 nativeGetPointerProperties(mNativePtr, i, pp[i]); 2975 nativeGetPointerCoords(mNativePtr, i, HISTORY_CURRENT, pc[i]); 2976 pc[i].x = clamp(pc[i].x, left, right); 2977 pc[i].y = clamp(pc[i].y, top, bottom); 2978 } 2979 ev.mNativePtr = nativeInitialize(ev.mNativePtr, 2980 nativeGetDeviceId(mNativePtr), nativeGetSource(mNativePtr), 2981 nativeGetAction(mNativePtr), nativeGetFlags(mNativePtr), 2982 nativeGetEdgeFlags(mNativePtr), nativeGetMetaState(mNativePtr), 2983 nativeGetButtonState(mNativePtr), 2984 nativeGetXOffset(mNativePtr), nativeGetYOffset(mNativePtr), 2985 nativeGetXPrecision(mNativePtr), nativeGetYPrecision(mNativePtr), 2986 nativeGetDownTimeNanos(mNativePtr), 2987 nativeGetEventTimeNanos(mNativePtr, HISTORY_CURRENT), 2988 pointerCount, pp, pc); 2989 return ev; 2990 } 2991 } 2992 2993 /** 2994 * Gets an integer where each pointer id present in the event is marked as a bit. 2995 * @hide 2996 */ getPointerIdBits()2997 public final int getPointerIdBits() { 2998 int idBits = 0; 2999 final int pointerCount = nativeGetPointerCount(mNativePtr); 3000 for (int i = 0; i < pointerCount; i++) { 3001 idBits |= 1 << nativeGetPointerId(mNativePtr, i); 3002 } 3003 return idBits; 3004 } 3005 3006 /** 3007 * Splits a motion event such that it includes only a subset of pointer ids. 3008 * @hide 3009 */ split(int idBits)3010 public final MotionEvent split(int idBits) { 3011 MotionEvent ev = obtain(); 3012 synchronized (gSharedTempLock) { 3013 final int oldPointerCount = nativeGetPointerCount(mNativePtr); 3014 ensureSharedTempPointerCapacity(oldPointerCount); 3015 final PointerProperties[] pp = gSharedTempPointerProperties; 3016 final PointerCoords[] pc = gSharedTempPointerCoords; 3017 final int[] map = gSharedTempPointerIndexMap; 3018 3019 final int oldAction = nativeGetAction(mNativePtr); 3020 final int oldActionMasked = oldAction & ACTION_MASK; 3021 final int oldActionPointerIndex = (oldAction & ACTION_POINTER_INDEX_MASK) 3022 >> ACTION_POINTER_INDEX_SHIFT; 3023 int newActionPointerIndex = -1; 3024 int newPointerCount = 0; 3025 int newIdBits = 0; 3026 for (int i = 0; i < oldPointerCount; i++) { 3027 nativeGetPointerProperties(mNativePtr, i, pp[newPointerCount]); 3028 final int idBit = 1 << pp[newPointerCount].id; 3029 if ((idBit & idBits) != 0) { 3030 if (i == oldActionPointerIndex) { 3031 newActionPointerIndex = newPointerCount; 3032 } 3033 map[newPointerCount] = i; 3034 newPointerCount += 1; 3035 newIdBits |= idBit; 3036 } 3037 } 3038 3039 if (newPointerCount == 0) { 3040 throw new IllegalArgumentException("idBits did not match any ids in the event"); 3041 } 3042 3043 final int newAction; 3044 if (oldActionMasked == ACTION_POINTER_DOWN || oldActionMasked == ACTION_POINTER_UP) { 3045 if (newActionPointerIndex < 0) { 3046 // An unrelated pointer changed. 3047 newAction = ACTION_MOVE; 3048 } else if (newPointerCount == 1) { 3049 // The first/last pointer went down/up. 3050 newAction = oldActionMasked == ACTION_POINTER_DOWN 3051 ? ACTION_DOWN : ACTION_UP; 3052 } else { 3053 // A secondary pointer went down/up. 3054 newAction = oldActionMasked 3055 | (newActionPointerIndex << ACTION_POINTER_INDEX_SHIFT); 3056 } 3057 } else { 3058 // Simple up/down/cancel/move or other motion action. 3059 newAction = oldAction; 3060 } 3061 3062 final int historySize = nativeGetHistorySize(mNativePtr); 3063 for (int h = 0; h <= historySize; h++) { 3064 final int historyPos = h == historySize ? HISTORY_CURRENT : h; 3065 3066 for (int i = 0; i < newPointerCount; i++) { 3067 nativeGetPointerCoords(mNativePtr, map[i], historyPos, pc[i]); 3068 } 3069 3070 final long eventTimeNanos = nativeGetEventTimeNanos(mNativePtr, historyPos); 3071 if (h == 0) { 3072 ev.mNativePtr = nativeInitialize(ev.mNativePtr, 3073 nativeGetDeviceId(mNativePtr), nativeGetSource(mNativePtr), 3074 newAction, nativeGetFlags(mNativePtr), 3075 nativeGetEdgeFlags(mNativePtr), nativeGetMetaState(mNativePtr), 3076 nativeGetButtonState(mNativePtr), 3077 nativeGetXOffset(mNativePtr), nativeGetYOffset(mNativePtr), 3078 nativeGetXPrecision(mNativePtr), nativeGetYPrecision(mNativePtr), 3079 nativeGetDownTimeNanos(mNativePtr), eventTimeNanos, 3080 newPointerCount, pp, pc); 3081 } else { 3082 nativeAddBatch(ev.mNativePtr, eventTimeNanos, pc, 0); 3083 } 3084 } 3085 return ev; 3086 } 3087 } 3088 3089 @Override toString()3090 public String toString() { 3091 StringBuilder msg = new StringBuilder(); 3092 msg.append("MotionEvent { action=").append(actionToString(getAction())); 3093 msg.append(", actionButton=").append(buttonStateToString(getActionButton())); 3094 3095 final int pointerCount = getPointerCount(); 3096 for (int i = 0; i < pointerCount; i++) { 3097 msg.append(", id[").append(i).append("]=").append(getPointerId(i)); 3098 msg.append(", x[").append(i).append("]=").append(getX(i)); 3099 msg.append(", y[").append(i).append("]=").append(getY(i)); 3100 msg.append(", toolType[").append(i).append("]=").append( 3101 toolTypeToString(getToolType(i))); 3102 } 3103 3104 msg.append(", buttonState=").append(MotionEvent.buttonStateToString(getButtonState())); 3105 msg.append(", metaState=").append(KeyEvent.metaStateToString(getMetaState())); 3106 msg.append(", flags=0x").append(Integer.toHexString(getFlags())); 3107 msg.append(", edgeFlags=0x").append(Integer.toHexString(getEdgeFlags())); 3108 msg.append(", pointerCount=").append(pointerCount); 3109 msg.append(", historySize=").append(getHistorySize()); 3110 msg.append(", eventTime=").append(getEventTime()); 3111 msg.append(", downTime=").append(getDownTime()); 3112 msg.append(", deviceId=").append(getDeviceId()); 3113 msg.append(", source=0x").append(Integer.toHexString(getSource())); 3114 msg.append(" }"); 3115 return msg.toString(); 3116 } 3117 3118 /** 3119 * Returns a string that represents the symbolic name of the specified unmasked action 3120 * such as "ACTION_DOWN", "ACTION_POINTER_DOWN(3)" or an equivalent numeric constant 3121 * such as "35" if unknown. 3122 * 3123 * @param action The unmasked action. 3124 * @return The symbolic name of the specified action. 3125 * @see #getAction() 3126 */ actionToString(int action)3127 public static String actionToString(int action) { 3128 switch (action) { 3129 case ACTION_DOWN: 3130 return "ACTION_DOWN"; 3131 case ACTION_UP: 3132 return "ACTION_UP"; 3133 case ACTION_CANCEL: 3134 return "ACTION_CANCEL"; 3135 case ACTION_OUTSIDE: 3136 return "ACTION_OUTSIDE"; 3137 case ACTION_MOVE: 3138 return "ACTION_MOVE"; 3139 case ACTION_HOVER_MOVE: 3140 return "ACTION_HOVER_MOVE"; 3141 case ACTION_SCROLL: 3142 return "ACTION_SCROLL"; 3143 case ACTION_HOVER_ENTER: 3144 return "ACTION_HOVER_ENTER"; 3145 case ACTION_HOVER_EXIT: 3146 return "ACTION_HOVER_EXIT"; 3147 case ACTION_BUTTON_PRESS: 3148 return "ACTION_BUTTON_PRESS"; 3149 case ACTION_BUTTON_RELEASE: 3150 return "ACTION_BUTTON_RELEASE"; 3151 } 3152 int index = (action & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT; 3153 switch (action & ACTION_MASK) { 3154 case ACTION_POINTER_DOWN: 3155 return "ACTION_POINTER_DOWN(" + index + ")"; 3156 case ACTION_POINTER_UP: 3157 return "ACTION_POINTER_UP(" + index + ")"; 3158 default: 3159 return Integer.toString(action); 3160 } 3161 } 3162 3163 /** 3164 * Returns a string that represents the symbolic name of the specified axis 3165 * such as "AXIS_X" or an equivalent numeric constant such as "42" if unknown. 3166 * 3167 * @param axis The axis. 3168 * @return The symbolic name of the specified axis. 3169 */ axisToString(int axis)3170 public static String axisToString(int axis) { 3171 String symbolicName = nativeAxisToString(axis); 3172 return symbolicName != null ? LABEL_PREFIX + symbolicName : Integer.toString(axis); 3173 } 3174 3175 /** 3176 * Gets an axis by its symbolic name such as "AXIS_X" or an 3177 * equivalent numeric constant such as "42". 3178 * 3179 * @param symbolicName The symbolic name of the axis. 3180 * @return The axis or -1 if not found. 3181 * @see KeyEvent#keyCodeToString(int) 3182 */ axisFromString(String symbolicName)3183 public static int axisFromString(String symbolicName) { 3184 if (symbolicName.startsWith(LABEL_PREFIX)) { 3185 symbolicName = symbolicName.substring(LABEL_PREFIX.length()); 3186 int axis = nativeAxisFromString(symbolicName); 3187 if (axis >= 0) { 3188 return axis; 3189 } 3190 } 3191 try { 3192 return Integer.parseInt(symbolicName, 10); 3193 } catch (NumberFormatException ex) { 3194 return -1; 3195 } 3196 } 3197 3198 /** 3199 * Returns a string that represents the symbolic name of the specified combined 3200 * button state flags such as "0", "BUTTON_PRIMARY", 3201 * "BUTTON_PRIMARY|BUTTON_SECONDARY" or an equivalent numeric constant such as "0x10000000" 3202 * if unknown. 3203 * 3204 * @param buttonState The button state. 3205 * @return The symbolic name of the specified combined button state flags. 3206 * @hide 3207 */ buttonStateToString(int buttonState)3208 public static String buttonStateToString(int buttonState) { 3209 if (buttonState == 0) { 3210 return "0"; 3211 } 3212 StringBuilder result = null; 3213 int i = 0; 3214 while (buttonState != 0) { 3215 final boolean isSet = (buttonState & 1) != 0; 3216 buttonState >>>= 1; // unsigned shift! 3217 if (isSet) { 3218 final String name = BUTTON_SYMBOLIC_NAMES[i]; 3219 if (result == null) { 3220 if (buttonState == 0) { 3221 return name; 3222 } 3223 result = new StringBuilder(name); 3224 } else { 3225 result.append('|'); 3226 result.append(name); 3227 } 3228 } 3229 i += 1; 3230 } 3231 return result.toString(); 3232 } 3233 3234 /** 3235 * Returns a string that represents the symbolic name of the specified tool type 3236 * such as "TOOL_TYPE_FINGER" or an equivalent numeric constant such as "42" if unknown. 3237 * 3238 * @param toolType The tool type. 3239 * @return The symbolic name of the specified tool type. 3240 * @hide 3241 */ toolTypeToString(int toolType)3242 public static String toolTypeToString(int toolType) { 3243 String symbolicName = TOOL_TYPE_SYMBOLIC_NAMES.get(toolType); 3244 return symbolicName != null ? symbolicName : Integer.toString(toolType); 3245 } 3246 3247 /** 3248 * Checks if a mouse or stylus button (or combination of buttons) is pressed. 3249 * @param button Button (or combination of buttons). 3250 * @return True if specified buttons are pressed. 3251 * 3252 * @see #BUTTON_PRIMARY 3253 * @see #BUTTON_SECONDARY 3254 * @see #BUTTON_TERTIARY 3255 * @see #BUTTON_FORWARD 3256 * @see #BUTTON_BACK 3257 * @see #BUTTON_STYLUS_PRIMARY 3258 * @see #BUTTON_STYLUS_SECONDARY 3259 */ isButtonPressed(int button)3260 public final boolean isButtonPressed(int button) { 3261 if (button == 0) { 3262 return false; 3263 } 3264 return (getButtonState() & button) == button; 3265 } 3266 3267 public static final Parcelable.Creator<MotionEvent> CREATOR 3268 = new Parcelable.Creator<MotionEvent>() { 3269 public MotionEvent createFromParcel(Parcel in) { 3270 in.readInt(); // skip token, we already know this is a MotionEvent 3271 return MotionEvent.createFromParcelBody(in); 3272 } 3273 3274 public MotionEvent[] newArray(int size) { 3275 return new MotionEvent[size]; 3276 } 3277 }; 3278 3279 /** @hide */ createFromParcelBody(Parcel in)3280 public static MotionEvent createFromParcelBody(Parcel in) { 3281 MotionEvent ev = obtain(); 3282 ev.mNativePtr = nativeReadFromParcel(ev.mNativePtr, in); 3283 return ev; 3284 } 3285 3286 /** @hide */ 3287 @Override cancel()3288 public final void cancel() { 3289 setAction(ACTION_CANCEL); 3290 } 3291 writeToParcel(Parcel out, int flags)3292 public void writeToParcel(Parcel out, int flags) { 3293 out.writeInt(PARCEL_TOKEN_MOTION_EVENT); 3294 nativeWriteToParcel(mNativePtr, out); 3295 } 3296 3297 /** 3298 * Transfer object for pointer coordinates. 3299 * 3300 * Objects of this type can be used to specify the pointer coordinates when 3301 * creating new {@link MotionEvent} objects and to query pointer coordinates 3302 * in bulk. 3303 * 3304 * Refer to {@link InputDevice} for information about how different kinds of 3305 * input devices and sources represent pointer coordinates. 3306 */ 3307 public static final class PointerCoords { 3308 private static final int INITIAL_PACKED_AXIS_VALUES = 8; 3309 private long mPackedAxisBits; 3310 private float[] mPackedAxisValues; 3311 3312 /** 3313 * Creates a pointer coords object with all axes initialized to zero. 3314 */ PointerCoords()3315 public PointerCoords() { 3316 } 3317 3318 /** 3319 * Creates a pointer coords object as a copy of the 3320 * contents of another pointer coords object. 3321 * 3322 * @param other The pointer coords object to copy. 3323 */ PointerCoords(PointerCoords other)3324 public PointerCoords(PointerCoords other) { 3325 copyFrom(other); 3326 } 3327 3328 /** @hide */ createArray(int size)3329 public static PointerCoords[] createArray(int size) { 3330 PointerCoords[] array = new PointerCoords[size]; 3331 for (int i = 0; i < size; i++) { 3332 array[i] = new PointerCoords(); 3333 } 3334 return array; 3335 } 3336 3337 /** 3338 * The X component of the pointer movement. 3339 * 3340 * @see MotionEvent#AXIS_X 3341 */ 3342 public float x; 3343 3344 /** 3345 * The Y component of the pointer movement. 3346 * 3347 * @see MotionEvent#AXIS_Y 3348 */ 3349 public float y; 3350 3351 /** 3352 * A normalized value that describes the pressure applied to the device 3353 * by a finger or other tool. 3354 * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure), 3355 * although values higher than 1 may be generated depending on the calibration of 3356 * the input device. 3357 * 3358 * @see MotionEvent#AXIS_PRESSURE 3359 */ 3360 public float pressure; 3361 3362 /** 3363 * A normalized value that describes the approximate size of the pointer touch area 3364 * in relation to the maximum detectable size of the device. 3365 * It represents some approximation of the area of the screen being 3366 * pressed; the actual value in pixels corresponding to the 3367 * touch is normalized with the device specific range of values 3368 * and scaled to a value between 0 and 1. The value of size can be used to 3369 * determine fat touch events. 3370 * 3371 * @see MotionEvent#AXIS_SIZE 3372 */ 3373 public float size; 3374 3375 /** 3376 * The length of the major axis of an ellipse that describes the touch area at 3377 * the point of contact. 3378 * If the device is a touch screen, the length is reported in pixels, otherwise it is 3379 * reported in device-specific units. 3380 * 3381 * @see MotionEvent#AXIS_TOUCH_MAJOR 3382 */ 3383 public float touchMajor; 3384 3385 /** 3386 * The length of the minor axis of an ellipse that describes the touch area at 3387 * the point of contact. 3388 * If the device is a touch screen, the length is reported in pixels, otherwise it is 3389 * reported in device-specific units. 3390 * 3391 * @see MotionEvent#AXIS_TOUCH_MINOR 3392 */ 3393 public float touchMinor; 3394 3395 /** 3396 * The length of the major axis of an ellipse that describes the size of 3397 * the approaching tool. 3398 * The tool area represents the estimated size of the finger or pen that is 3399 * touching the device independent of its actual touch area at the point of contact. 3400 * If the device is a touch screen, the length is reported in pixels, otherwise it is 3401 * reported in device-specific units. 3402 * 3403 * @see MotionEvent#AXIS_TOOL_MAJOR 3404 */ 3405 public float toolMajor; 3406 3407 /** 3408 * The length of the minor axis of an ellipse that describes the size of 3409 * the approaching tool. 3410 * The tool area represents the estimated size of the finger or pen that is 3411 * touching the device independent of its actual touch area at the point of contact. 3412 * If the device is a touch screen, the length is reported in pixels, otherwise it is 3413 * reported in device-specific units. 3414 * 3415 * @see MotionEvent#AXIS_TOOL_MINOR 3416 */ 3417 public float toolMinor; 3418 3419 /** 3420 * The orientation of the touch area and tool area in radians clockwise from vertical. 3421 * An angle of 0 radians indicates that the major axis of contact is oriented 3422 * upwards, is perfectly circular or is of unknown orientation. A positive angle 3423 * indicates that the major axis of contact is oriented to the right. A negative angle 3424 * indicates that the major axis of contact is oriented to the left. 3425 * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians 3426 * (finger pointing fully right). 3427 * 3428 * @see MotionEvent#AXIS_ORIENTATION 3429 */ 3430 public float orientation; 3431 3432 /** 3433 * Clears the contents of this object. 3434 * Resets all axes to zero. 3435 */ clear()3436 public void clear() { 3437 mPackedAxisBits = 0; 3438 3439 x = 0; 3440 y = 0; 3441 pressure = 0; 3442 size = 0; 3443 touchMajor = 0; 3444 touchMinor = 0; 3445 toolMajor = 0; 3446 toolMinor = 0; 3447 orientation = 0; 3448 } 3449 3450 /** 3451 * Copies the contents of another pointer coords object. 3452 * 3453 * @param other The pointer coords object to copy. 3454 */ copyFrom(PointerCoords other)3455 public void copyFrom(PointerCoords other) { 3456 final long bits = other.mPackedAxisBits; 3457 mPackedAxisBits = bits; 3458 if (bits != 0) { 3459 final float[] otherValues = other.mPackedAxisValues; 3460 final int count = Long.bitCount(bits); 3461 float[] values = mPackedAxisValues; 3462 if (values == null || count > values.length) { 3463 values = new float[otherValues.length]; 3464 mPackedAxisValues = values; 3465 } 3466 System.arraycopy(otherValues, 0, values, 0, count); 3467 } 3468 3469 x = other.x; 3470 y = other.y; 3471 pressure = other.pressure; 3472 size = other.size; 3473 touchMajor = other.touchMajor; 3474 touchMinor = other.touchMinor; 3475 toolMajor = other.toolMajor; 3476 toolMinor = other.toolMinor; 3477 orientation = other.orientation; 3478 } 3479 3480 /** 3481 * Gets the value associated with the specified axis. 3482 * 3483 * @param axis The axis identifier for the axis value to retrieve. 3484 * @return The value associated with the axis, or 0 if none. 3485 * 3486 * @see MotionEvent#AXIS_X 3487 * @see MotionEvent#AXIS_Y 3488 */ getAxisValue(int axis)3489 public float getAxisValue(int axis) { 3490 switch (axis) { 3491 case AXIS_X: 3492 return x; 3493 case AXIS_Y: 3494 return y; 3495 case AXIS_PRESSURE: 3496 return pressure; 3497 case AXIS_SIZE: 3498 return size; 3499 case AXIS_TOUCH_MAJOR: 3500 return touchMajor; 3501 case AXIS_TOUCH_MINOR: 3502 return touchMinor; 3503 case AXIS_TOOL_MAJOR: 3504 return toolMajor; 3505 case AXIS_TOOL_MINOR: 3506 return toolMinor; 3507 case AXIS_ORIENTATION: 3508 return orientation; 3509 default: { 3510 if (axis < 0 || axis > 63) { 3511 throw new IllegalArgumentException("Axis out of range."); 3512 } 3513 final long bits = mPackedAxisBits; 3514 final long axisBit = 0x8000000000000000L >>> axis; 3515 if ((bits & axisBit) == 0) { 3516 return 0; 3517 } 3518 final int index = Long.bitCount(bits & ~(0xFFFFFFFFFFFFFFFFL >>> axis)); 3519 return mPackedAxisValues[index]; 3520 } 3521 } 3522 } 3523 3524 /** 3525 * Sets the value associated with the specified axis. 3526 * 3527 * @param axis The axis identifier for the axis value to assign. 3528 * @param value The value to set. 3529 * 3530 * @see MotionEvent#AXIS_X 3531 * @see MotionEvent#AXIS_Y 3532 */ setAxisValue(int axis, float value)3533 public void setAxisValue(int axis, float value) { 3534 switch (axis) { 3535 case AXIS_X: 3536 x = value; 3537 break; 3538 case AXIS_Y: 3539 y = value; 3540 break; 3541 case AXIS_PRESSURE: 3542 pressure = value; 3543 break; 3544 case AXIS_SIZE: 3545 size = value; 3546 break; 3547 case AXIS_TOUCH_MAJOR: 3548 touchMajor = value; 3549 break; 3550 case AXIS_TOUCH_MINOR: 3551 touchMinor = value; 3552 break; 3553 case AXIS_TOOL_MAJOR: 3554 toolMajor = value; 3555 break; 3556 case AXIS_TOOL_MINOR: 3557 toolMinor = value; 3558 break; 3559 case AXIS_ORIENTATION: 3560 orientation = value; 3561 break; 3562 default: { 3563 if (axis < 0 || axis > 63) { 3564 throw new IllegalArgumentException("Axis out of range."); 3565 } 3566 final long bits = mPackedAxisBits; 3567 final long axisBit = 0x8000000000000000L >>> axis; 3568 final int index = Long.bitCount(bits & ~(0xFFFFFFFFFFFFFFFFL >>> axis)); 3569 float[] values = mPackedAxisValues; 3570 if ((bits & axisBit) == 0) { 3571 if (values == null) { 3572 values = new float[INITIAL_PACKED_AXIS_VALUES]; 3573 mPackedAxisValues = values; 3574 } else { 3575 final int count = Long.bitCount(bits); 3576 if (count < values.length) { 3577 if (index != count) { 3578 System.arraycopy(values, index, values, index + 1, 3579 count - index); 3580 } 3581 } else { 3582 float[] newValues = new float[count * 2]; 3583 System.arraycopy(values, 0, newValues, 0, index); 3584 System.arraycopy(values, index, newValues, index + 1, 3585 count - index); 3586 values = newValues; 3587 mPackedAxisValues = values; 3588 } 3589 } 3590 mPackedAxisBits = bits | axisBit; 3591 } 3592 values[index] = value; 3593 } 3594 } 3595 } 3596 } 3597 3598 /** 3599 * Transfer object for pointer properties. 3600 * 3601 * Objects of this type can be used to specify the pointer id and tool type 3602 * when creating new {@link MotionEvent} objects and to query pointer properties in bulk. 3603 */ 3604 public static final class PointerProperties { 3605 /** 3606 * Creates a pointer properties object with an invalid pointer id. 3607 */ PointerProperties()3608 public PointerProperties() { 3609 clear(); 3610 } 3611 3612 /** 3613 * Creates a pointer properties object as a copy of the contents of 3614 * another pointer properties object. 3615 * @param other 3616 */ PointerProperties(PointerProperties other)3617 public PointerProperties(PointerProperties other) { 3618 copyFrom(other); 3619 } 3620 3621 /** @hide */ createArray(int size)3622 public static PointerProperties[] createArray(int size) { 3623 PointerProperties[] array = new PointerProperties[size]; 3624 for (int i = 0; i < size; i++) { 3625 array[i] = new PointerProperties(); 3626 } 3627 return array; 3628 } 3629 3630 /** 3631 * The pointer id. 3632 * Initially set to {@link #INVALID_POINTER_ID} (-1). 3633 * 3634 * @see MotionEvent#getPointerId(int) 3635 */ 3636 public int id; 3637 3638 /** 3639 * The pointer tool type. 3640 * Initially set to 0. 3641 * 3642 * @see MotionEvent#getToolType(int) 3643 */ 3644 public int toolType; 3645 3646 /** 3647 * Resets the pointer properties to their initial values. 3648 */ clear()3649 public void clear() { 3650 id = INVALID_POINTER_ID; 3651 toolType = TOOL_TYPE_UNKNOWN; 3652 } 3653 3654 /** 3655 * Copies the contents of another pointer properties object. 3656 * 3657 * @param other The pointer properties object to copy. 3658 */ copyFrom(PointerProperties other)3659 public void copyFrom(PointerProperties other) { 3660 id = other.id; 3661 toolType = other.toolType; 3662 } 3663 3664 @Override equals(Object other)3665 public boolean equals(Object other) { 3666 if (other instanceof PointerProperties) { 3667 return equals((PointerProperties)other); 3668 } 3669 return false; 3670 } 3671 equals(PointerProperties other)3672 private boolean equals(PointerProperties other) { 3673 return other != null && id == other.id && toolType == other.toolType; 3674 } 3675 3676 @Override hashCode()3677 public int hashCode() { 3678 return id | (toolType << 8); 3679 } 3680 } 3681 } 3682