StrokeInputBatch


public abstract class StrokeInputBatch

Known direct subclasses
ImmutableStrokeInputBatch

An immutable implementation of StrokeInputBatch.

MutableStrokeInputBatch

A mutable implementation of StrokeInputBatch.


A read-only view of an object that stores multiple StrokeInput values together in a more memory-efficient manner than just List<StrokeInput>. The input points in this batch are guaranteed to be consistent with one another – for example, they all have the same toolType and the same set of optional fields like pressure/tilt/orientation, and their timestamps are all monotonically non-decreasing. This can be an ImmutableStrokeInputBatch for data that cannot change, and a MutableStrokeInputBatch for data that is meant to be modified or incrementally built.

Summary

Nested types

public static class StrokeInputBatch.Companion

Public methods

final @NonNull StrokeInput
get(int index)

Gets the value of the i-th input.

final long

The duration between the first and last input in milliseconds.

final int

Number of StrokeInput objects in the batch.

final float

The physical distance in centimeters that the pointer must travel in order to produce an input motion of one stroke unit.

final @NonNull InputToolType

How this input stream should be interpreted, as coming from a InputToolType.MOUSE, InputToolType.TOUCH, or InputToolType.STYLUS.

final boolean

Whether all of the individual inputs have a defined value for StrokeInput.orientationRadians.

final boolean

Whether all of the individual inputs have a defined value for StrokeInput.pressure.

final boolean

Whether strokeUnitLengthCm has a valid value, which is something other than StrokeInput.NO_STROKE_UNIT_LENGTH.

final boolean

Whether all of the individual inputs have a defined value for StrokeInput.tiltRadians.

final boolean

true if there are no StrokeInput objects in the batch, and false otherwise.

final @NonNull StrokeInput
populate(int index, @NonNull StrokeInput outStrokeInput)

Gets the value of the i-th input and overwrites outStrokeInput, which it then returns.

Protected methods

final void

Extension functions

final @NonNull PartitionedMesh

Creates a PartitionedMesh of the shape enclosed by the given StrokeInputBatch input points.

final void

Write the gzip-compressed serialized representation of the CodedStrokeInputBatch to the given OutputStream.

Public methods

get

Added in 1.0.0-alpha03
public final @NonNull StrokeInput get(int index)

Gets the value of the i-th input. Requires that index is positive and less than size.

In performance-sensitive code, prefer to use populate to pass in a pre-allocated instance and reuse that instance across multiple calls to this function.

getDurationMillis

Added in 1.0.0-alpha03
public final long getDurationMillis()

The duration between the first and last input in milliseconds.

getSize

Added in 1.0.0-alpha03
public final int getSize()

Number of StrokeInput objects in the batch.

getStrokeUnitLengthCm

Added in 1.0.0-alpha03
public final float getStrokeUnitLengthCm()

The physical distance in centimeters that the pointer must travel in order to produce an input motion of one stroke unit. For stylus/touch, this is the real-world distance that the stylus/fingertip must move in physical space; for mouse, this is the visual distance that the mouse pointer must travel along the surface of the display.

A value of StrokeInput.NO_STROKE_UNIT_LENGTH indicates that the relationship between stroke space and physical space is unknown or ill-defined.

getToolType

Added in 1.0.0-alpha03
public final @NonNull InputToolType getToolType()

How this input stream should be interpreted, as coming from a InputToolType.MOUSE, InputToolType.TOUCH, or InputToolType.STYLUS.

hasOrientation

Added in 1.0.0-alpha03
public final boolean hasOrientation()

Whether all of the individual inputs have a defined value for StrokeInput.orientationRadians. If not, then no input items have an orientation value.

hasPressure

Added in 1.0.0-alpha03
public final boolean hasPressure()

Whether all of the individual inputs have a defined value for StrokeInput.pressure. If not, then no input items have a pressure value.

hasStrokeUnitLength

Added in 1.0.0-alpha03
public final boolean hasStrokeUnitLength()

Whether strokeUnitLengthCm has a valid value, which is something other than StrokeInput.NO_STROKE_UNIT_LENGTH.

hasTilt

Added in 1.0.0-alpha03
public final boolean hasTilt()

Whether all of the individual inputs have a defined value for StrokeInput.tiltRadians. If not, then no input items have a tilt value.

isEmpty

Added in 1.0.0-alpha03
public final boolean isEmpty()

true if there are no StrokeInput objects in the batch, and false otherwise.

populate

Added in 1.0.0-alpha03
public final @NonNull StrokeInput populate(int index, @NonNull StrokeInput outStrokeInput)

Gets the value of the i-th input and overwrites outStrokeInput, which it then returns. Requires that index is positive and less than size.

Protected methods

finalize

Added in 1.0.0-alpha03
protected final void finalize()

Extension functions

MeshCreation.createClosedShape

public final @NonNull PartitionedMesh MeshCreation.createClosedShape(@NonNull StrokeInputBatch receiver)

Creates a PartitionedMesh of the shape enclosed by the given StrokeInputBatch input points. A typical use case is selecting a region of the scene and performing hit testing with the resulting PartitionedMesh.

For a given stroke this algorithm aims to:

  1. Identify and create any connections that the user may have intended to make but did not fully connect.

  2. Trim any extra end points that the user did not intend to be part of the selected area.

Example usage:

fun onStrokeFinished(stroke: Stroke) {
val selectionRegion = stroke.inputs.createClosedShape()
for (stroke in myScene.strokes) {
if (stroke.shape.intersects(selectionRegion)) {
myScene.setSelected(stroke, true)
}
}
}
Parameters
@NonNull StrokeInputBatch receiver

The StrokeInputBatch to create a closed shape from.

Returns
@NonNull PartitionedMesh

The PartitionedMesh of the closed shape. If there are fewer than 3 input points, or if there are fewer than 3 points remaining after removing points with the same (x,y) coordinates as the previous point, this function will return a PartitionedMesh that is point-like (1 point remaining) or segment-like (2 points remaining). The resulting mesh will have an area of 0 but can still be used for hit testing via intersection.

StrokeInputBatchSerialization.encode

public final void StrokeInputBatchSerialization.encode(
    @NonNull StrokeInputBatch receiver,
    @NonNull OutputStream output
)

Write the gzip-compressed serialized representation of the CodedStrokeInputBatch to the given OutputStream.