public final class ZoomGestureDetector


Detector that interprets MotionEvents and notify users when a zooming gesture has occurred.

To use this class to do pinch-to-zoom on the viewfinder:

import androidx.camera.viewfinder.core.ZoomGestureDetector
import androidx.camera.viewfinder.core.ZoomGestureDetector.ZoomEvent

val zoomGestureDetector =
    ZoomGestureDetector(context) { zoomEvent ->
        when (zoomEvent) {
            is ZoomEvent.Move -> {
                val zoomState = camera.cameraInfo.zoomState.value!!
                val ratio = zoomState.zoomRatio * zoomEvent.incrementalScaleFactor
                val minRatio = zoomState.minZoomRatio
                val maxRatio = zoomState.maxZoomRatio
                val clampedRatio = min(max(ratio, minRatio), maxRatio)
                camera.cameraControl.setZoomRatio(clampedRatio)
            }
            is ZoomEvent.Begin -> {
                // Handle the begin event. For example, determine whether this gesture
                // should be processed further.
            }
            is ZoomEvent.End -> {
                // Handle the end event. For example, show a UI indicator.
            }
        }
        true
    }

return zoomGestureDetector.onTouchEvent(event)

Summary

Nested types

The listener for receiving notifications when gestures occur.

public abstract class ZoomGestureDetector.ZoomEvent

The zoom event that contains extended info about event state.

The beginning of a zoom gesture.

The end of a zoom gesture.

The moving events of a gesture in progress.

Public constructors

ZoomGestureDetector(
    @NonNull Context context,
    @Px int spanSlop,
    @Px int minSpan,
    @NonNull ZoomGestureDetector.OnZoomGestureListener listener
)

Creates a ZoomGestureDetector for detecting zooming gesture.

Public methods

final long

Returns the time difference in milliseconds between the previous accepted zooming event and the current zooming event.

final boolean

Whether the quick zoom gesture, in which the user performs a double tap followed by a swipe, should perform zooming.

final boolean

Whether the stylus zoom gesture, in which the user uses a stylus and presses the button, should perform zooming.

final boolean

Accepts MotionEvents and dispatches events to a OnZoomGestureListener when appropriate.

final void
setQuickZoomEnabled(boolean isQuickZoomEnabled)

Whether the quick zoom gesture, in which the user performs a double tap followed by a swipe, should perform zooming.

final void
setStylusZoomEnabled(boolean isStylusZoomEnabled)

Whether the stylus zoom gesture, in which the user uses a stylus and presses the button, should perform zooming.

Public constructors

ZoomGestureDetector

Added in 1.4.0-alpha10
public ZoomGestureDetector(
    @NonNull Context context,
    @Px int spanSlop,
    @Px int minSpan,
    @NonNull ZoomGestureDetector.OnZoomGestureListener listener
)

Creates a ZoomGestureDetector for detecting zooming gesture.

Parameters
@NonNull Context context

The application context.

@Px int spanSlop

The distance in pixels touches can wander before a gesture to be interpreted as zooming.

@Px int minSpan

The distance in pixels between touches that must be reached for a gesture to be interpreted as zooming.

@NonNull ZoomGestureDetector.OnZoomGestureListener listener

The listener to receive the callback.

Public methods

getTimeDelta

Added in 1.4.0-alpha10
public final long getTimeDelta()

Returns the time difference in milliseconds between the previous accepted zooming event and the current zooming event.

Returns
long

Time difference since the last zooming event in milliseconds.

isQuickZoomEnabled

Added in 1.4.0-alpha10
public final boolean isQuickZoomEnabled()

Whether the quick zoom gesture, in which the user performs a double tap followed by a swipe, should perform zooming.

If not set, this is enabled by default.

isStylusZoomEnabled

Added in 1.4.0-alpha10
public final boolean isStylusZoomEnabled()

Whether the stylus zoom gesture, in which the user uses a stylus and presses the button, should perform zooming.

If not set, this is enabled by default.

onTouchEvent

Added in 1.4.0-alpha10
@UiThread
public final boolean onTouchEvent(@NonNull MotionEvent event)

Accepts MotionEvents and dispatches events to a OnZoomGestureListener when appropriate.

Applications should pass a complete and consistent event stream to this method.

A complete and consistent event stream involves all MotionEvents from the initial MotionEvent.ACTION_DOWN to the final MotionEvent.ACTION_UP or MotionEvent.ACTION_CANCEL.

Parameters
@NonNull MotionEvent event

The event to process.

Returns
boolean

true if the event was processed and the detector wants to receive the rest of the MotionEvents in this event stream. Return it in the View.onTouchEvent for a normal use case.

setQuickZoomEnabled

Added in 1.4.0-alpha10
public final void setQuickZoomEnabled(boolean isQuickZoomEnabled)

Whether the quick zoom gesture, in which the user performs a double tap followed by a swipe, should perform zooming.

If not set, this is enabled by default.

setStylusZoomEnabled

Added in 1.4.0-alpha10
public final void setStylusZoomEnabled(boolean isStylusZoomEnabled)

Whether the stylus zoom gesture, in which the user uses a stylus and presses the button, should perform zooming.

If not set, this is enabled by default.