Files
notes/docs/lectures/mdp/14_touch_tech.md
T

6.6 KiB
Raw Blame History

Touch Technology

Resistive Touch Screen

  • Two sheets of transparent layers with metallic (resistive) coating facing each other with a thin gap in between

image-20220117192647424

image-20220117192702751

image-20220117192716222

  • Can be used with a finger or any pointing device (passive)
  • Requires a certain amount of pressure (to get the resistance to register)
  • Can be modified for multi-touch (only two touches)
  • Has high tolerance for liquids and contaminants
    • They're still used in hospitals and industry where fluids have a high spill rate

Surface Capacitive Touch Screen

  • Screen is covered in a capacitive material
    • This is 90% transparent
  • Capacitance - ability to store electrical charge (this works through glass)
  • We apply a small voltage to generate an electrostatic field
  • Humans naturally act as small capacitors; touching the screen with a finger creates a dynamic capacitor.
  • Measure the effective capacitance at each corner of the screen
    • The larger the change, the closer to the corner the touch was
    • Combine these measurements from all corners to find the exact location of the touch

image-20220117193603738

Using the distance from all 4 corners to determine the location. This only actually needs 3 corners; the 4th is used for accuracy.

Projected (Mutual) Capacitance

For multi-touch, there is a grid of sensors.

image-20220117204813192

  • Conductive material is etched with rows & columns
  • An electric field is projected through the top layer of the glass
  • A human acts as a conductor; a decrease in capacitance between electrodes is detected as a touch

The 1st-generation iPhone had a 10 x 15 (150) grid of sensors.

To get a higher resolution:

image-20220117205050223

Similarly, we can do this with multiple touches

image-20220117205141036

3D touch

  • Pressure-sensitive touch
  • This involves flexible glass
    • Pressing forces the finger closer to the rear capacitor
      • We can use this to measure depth, not location

Gestures

Gesture - A series of touch events that occur over a period of time

TouchBegin(), TouchMoved(), TouchEnded()

Two ways to register these:

  1. Implement onTouchEvent() in an activity
  2. Register a new OnTouchListener with a view - setOnTouchListener(...)

One or more fingers on the screen will trigger the callbacks of onTouchEvent() on the view.

Either way, the detailed interactions are delivered using a MotionEvents object

MotionEvent

This object encapsulates information about:

  • Touch events
    • A touch begins (ACTION_DOWN)
    • The finger moves (ACTION_MOVE)
    • The touch ends (ACTION_UP)
  • (x,y) coordinates of the touch, information about pressure, size, orientation, etc.
  • Additional information for multi-touch, e.g. pointer ID, action index, etc.
ACTION_DOWN
  • A gesture starts when a finger is pressed
  • A MotionEvent is generated for this
  • Find the action by calling getAction()
  • This can also have the identifier of the pointer, so use getActionMasked() for multi-touch
ACTION_MOVE
  • As the finger moves, a series of ACTION_MOVE events will be sent
  • Find the new position using getX() and getY() (returns floats)
  • Note that Android bundles these into a series of touch events, so we can get historic touches
ACTION_UP
  • A gesture ends in three ways
    1. ACTION_UP - last finger has been taken off the display
    2. ACTION_CANCEL event - another event happens, cancelling the gesture, e.g. the phone rings
    3. ACTION_OUTSIDE event - if the finger moves outside the relevant view

Single Touch Gesture

Formed of:

  1. A single ACTION_DOWN
  2. Zero or more ACTION_MOVE
  3. An ACTION_UP to finish

Single-touch interactions

  • Positions are tracked to move an object
  • Use movement velocity for a swipe / fling

Dragging & Scrolling

  • Store the original (x,y) touch location from ACTION_DOWN
  • Calculate changes from stored value and value returned from ACTION_MOVE or ACTION_UP
  • Adding the coordinate changes to the original object location

Swipe / Fling

  • Rather than moving the object, we can calculate the velocity and direction
  • On ACTION_UP, continue to move the object with that velocity
  • Gives the user obvious visual feedback of flinging UI elements across the screen

Customised Gestures

Several different ways of tracking the movement of a gesture

  • Use the starting and ending point of a pointer
  • Use the direction the pointer is travelling
  • Use velocity of the pointer
  • Use getHistorical<Value> to get historical movements

Multi-touch Gestures

  • Very similar to single touch
  • Same sequence of events with a few more events
    • ACTION_POINTER_DOWN & ACTION_POINTER_UP
    • Support for 256 touches at the same time
Determining Finger
  • Index: position within the array in a MotionEvent
  • ID: Unique for each pointer (finger) to allow tracking an individual pointer across the entire gesture
  • The number of pointers can change as fingers are lifted or placed; so do the indices of the pointers
  • Each pointer is given an ID that won’t change
    • Need to track both the ID and past locations of pointers to move things about

image-20220117212640923

onTouchEvent and motionEvent

  • onTouchEvent is a callback method
  • motionEvent is an object that contains gesture information
  • When a user places fingers on the screen, it triggers the callback onTouchEvent() on the view
  • After some touch actions, the motionEvent delivered to onTouchEvent() provides the details of every interaction
public boolean onTouchEvent(MotionEvent event) {
	...
    int maskedAction = event.getActionMasked();
    switch (maskedAction) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:
}

Pinch to zoom

  • Obtain the IDs of the two pointers
    • Use this to get the index so we can get locations
  • Calculate and store the distance between the two pointers
  • The ratio of the new distance to the old one gives the zoom / scale ratio

Two-finger rotation

  • Obtain the IDs of the two pointers
    • Use this to get the index so we can get locations
  • Use the vertical and horizontal location difference to calculate the initial angle
  • Obtain the new locations of the two pointers to derive the new angle
  • Object can be rotated using the difference in angles