6.6 KiB
Touch Technology
Resistive Touch Screen
- Two sheets of transparent layers with metallic (resistive) coating facing each other with a thin gap in between
- 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
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.
- 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:
Similarly, we can do this with multiple touches
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
- Pressing forces the finger closer to the rear capacitor
Gestures
Gesture - A series of touch events that occur over a period of time
TouchBegin(), TouchMoved(), TouchEnded()
Two ways to register these:
- Implement
onTouchEvent()in an activity - Register a new
OnTouchListenerwith 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)
- A touch begins (
- (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
MotionEventis 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()andgetY()(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
ACTION_UP- last finger has been taken off the displayACTION_CANCELevent - another event happens, cancelling the gesture, e.g. the phone ringsACTION_OUTSIDEevent - if the finger moves outside the relevant view
Single Touch Gesture
Formed of:
- A single
ACTION_DOWN - Zero or more
ACTION_MOVE - An
ACTION_UPto 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_MOVEorACTION_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
onTouchEvent and motionEvent
onTouchEventis a callback methodmotionEventis 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
motionEventdelivered toonTouchEvent()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







