LowLatencyCanvasView


@RequiresApi(value = 29)
class LowLatencyCanvasView : ViewGroup


View implementation that leverages a "front buffered" rendering system. This allows for lower latency graphics by leveraging a combination of front buffered alongside multi-buffered content layers. This class provides similar functionality to CanvasFrontBufferedRenderer, however, leverages the traditional View system for implementing the multi buffered content instead of a separate SurfaceControlCompat instance and entirely abstracts all SurfaceView usage for simplicity.

Drawing of this View's content is handled by a consumer specified LowLatencyCanvasView.Callback implementation instead of View.onDraw. Rendering here is done with a Canvas into a single buffer that is presented on screen above the rest of the View hierarchy content. This overlay is transient and will only be visible after LowLatencyCanvasView.renderFrontBufferedLayer is called and hidden after LowLatencyCanvasView.commit is invoked. After LowLatencyCanvasView.commit is invoked, this same buffer is wrapped into a bitmap and drawn within this View's View.onDraw implementation.

Calls to LowLatencyCanvasView.renderFrontBufferedLayer will trigger LowLatencyCanvasView.Callback.onDrawFrontBufferedLayer to be invoked to handle drawing of content with the provided Canvas.

After LowLatencyCanvasView.commit is called, the overlay is hidden and the buffer is drawn within the View hierarchy, similar to traditional View implementations.

A common use case would be a drawing application that intends to minimize the amount of latency when content is drawn with a stylus. In this case, touch events between MotionEvent.ACTION_DOWN and MotionEvent.ACTION_MOVE can trigger calls to LowLatencyCanvasView.renderFrontBufferedLayer which will minimize the delay between then the content is visible on screen. Finally when the gesture is complete on MotionEvent.ACTION_UP, a call to LowLatencyCanvasView.commit would be invoked to hide the transient overlay and render the scene within the View hierarchy like a traditional View. This helps provide a balance of low latency guarantees while mitigating potential tearing artifacts.

This helps support low latency rendering for simpler use cases at the expensive of configuration customization of the multi buffered layer content.

import androidx.annotation.WorkerThread
import androidx.graphics.lowlatency.LowLatencyCanvasView

LowLatencyCanvasView(context).apply {
    setBackgroundColor(Color.WHITE)

    data class Line(
        val x1: Float,
        val y1: Float,
        val x2: Float,
        val y2: Float,
    )
    // Thread safe collection to support creation of new lines from the UI thread as well as
    // consumption of lines from the background drawing thread
    val lines = Collections.synchronizedList(ArrayList<Line>())
    setRenderCallback(object : LowLatencyCanvasView.Callback {

        val mAllLines = ArrayList<Line>()

        private val mPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
            strokeWidth = 15f
            color = Color.CYAN
            alpha = 128
        }

        @WorkerThread
        override fun onRedrawRequested(
            canvas: Canvas,
            width: Int,
            height: Int
        ) {
            for (line in mAllLines) {
                canvas.drawLine(line.x1, line.y1, line.x2, line.y2, mPaint)
            }
        }

        @WorkerThread
        override fun onDrawFrontBufferedLayer(
            canvas: Canvas,
            width: Int,
            height: Int
        ) {
            lines.removeFirstOrNull()?.let { line ->
                mAllLines.add(line)
                canvas.drawLine(line.x1, line.y1, line.x2, line.y2, mPaint)
            }
        }
    })
    setOnTouchListener(object : View.OnTouchListener {

        var mCurrentX = -1f
        var mCurrentY = -1f
        var mPreviousX = -1f
        var mPreviousY = -1f

        override fun onTouch(v: View?, event: MotionEvent?): Boolean {
            if (event == null) return false
            when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    requestUnbufferedDispatch(event)
                    mCurrentX = event.x
                    mCurrentY = event.y
                }
                MotionEvent.ACTION_MOVE -> {
                    mPreviousX = mCurrentX
                    mPreviousY = mCurrentY
                    mCurrentX = event.x
                    mCurrentY = event.y

                    val line = Line(mPreviousX, mPreviousY, mCurrentX, mCurrentY)
                    lines.add(line)
                    renderFrontBufferedLayer()
                }
                MotionEvent.ACTION_CANCEL -> {
                    cancel()
                }
                MotionEvent.ACTION_UP -> {
                    commit()
                }
            }
            return true
        }
    })
}

Summary

Nested types

Provides callbacks for consumers to draw into the front buffered overlay as well as provide opportunities to synchronize SurfaceControlCompat.Transactions to submit the layers to the hardware compositor

Public constructors

LowLatencyCanvasView(context: Context, attrs: AttributeSet?, defStyle: Int)

Public functions

open Unit
addView(child: View?)
open Unit
addView(child: View?, index: Int)
open Unit
addView(child: View?, params: ViewGroup.LayoutParams?)
open Unit
addView(child: View?, index: Int, params: ViewGroup.LayoutParams?)
open Unit
addView(child: View?, width: Int, height: Int)
Unit

Cancels any in progress request to render to the front buffer and hides the front buffered overlay.

Unit

Clears the content of the buffer and hides the front buffered overlay.

Unit

Invalidates this View and draws the buffer within View#onDraw.

Unit
execute(runnable: Runnable)

Dispatches a runnable to be executed on the background rendering thread.

Unit

Render content to the front buffered layer.

Unit

Configures the Callback used to render contents to the front buffered overlay as well as optionally configuring the SurfaceControlCompat.Transaction used to update contents on screen.

Protected functions

open Unit
open Unit
onDraw(canvas: Canvas)
open Unit
onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int)

Inherited functions

From android.view.accessibility.AccessibilityEventSource
From android.graphics.drawable.Drawable.Callback
open Unit
open Unit
scheduleDrawable(who: Drawable, what: Runnable, when: Long)
open Unit
From android.view.KeyEvent.Callback
open Boolean
onKeyDown(keyCode: Int, event: KeyEvent)
open Boolean
onKeyLongPress(keyCode: Int, event: KeyEvent)
open Boolean
onKeyMultiple(keyCode: Int, repeatCount: Int, event: KeyEvent)
open Boolean
onKeyUp(keyCode: Int, event: KeyEvent)
From android.view.View
open Unit
open Unit
addExtraDataToAccessibilityNodeInfo(
    info: AccessibilityNodeInfo,
    extraDataKey: String,
    arguments: Bundle?
)
open Unit
addFocusables(views: ArrayList<View>, direction: Int)
open Unit
addFocusables(views: ArrayList<View>, direction: Int, focusableMode: Int)
open Unit
addKeyboardNavigationClusters(
    views: MutableCollection<View>,
    direction: Int
)
open Unit
open Unit
open Unit
open Unit
open ViewPropertyAnimator
open Unit

This function is deprecated. Deprecated in Java

open Unit
open Unit
open Boolean
open Boolean
awakenScrollBars(startDelay: Int)
open Boolean
awakenScrollBars(startDelay: Int, invalidate: Boolean)
open Unit
open Unit

This function is deprecated. Deprecated in Java

open Unit

This function is deprecated. Deprecated in Java

open Unit
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
Unit
open Unit
Unit
open Boolean
open Unit
open Unit
open Unit
open Unit
open Int
open Int
open Int
open Unit
open WindowInsets
open Int
open Int
open Int
open AccessibilityNodeInfo
open Unit
open Unit

This function is deprecated. Deprecated in Java

open WindowInsets
open Boolean
open Unit
open Unit
dispatchCreateViewTranslationRequest(
    viewIds: MutableMap<AutofillIdLongArray>,
    supportedFormats: IntArray,
    capability: TranslationCapability?,
    requests: MutableList<ViewTranslationRequest>
)
open Unit
open Boolean
open Unit
open Unit
open Unit
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
dispatchNestedFling(velocityX: Float, velocityY: Float, consumed: Boolean)
open Boolean
dispatchNestedPreFling(velocityX: Float, velocityY: Float)
open Boolean
dispatchNestedPrePerformAccessibilityAction(
    action: Int,
    arguments: Bundle?
)
open Boolean
dispatchNestedPreScroll(
    dx: Int,
    dy: Int,
    consumed: IntArray?,
    offsetInWindow: IntArray?
)
open Boolean
dispatchNestedScroll(
    dxConsumed: Int,
    dyConsumed: Int,
    dxUnconsumed: Int,
    dyUnconsumed: Int,
    offsetInWindow: IntArray?
)
open Unit
open Boolean
open Unit
open Unit
open Unit
open Unit
open Unit
dispatchScrollCaptureSearch(
    localVisibleRect: Rect,
    windowOffset: Point,
    targets: Consumer<ScrollCaptureTarget>
)
open Unit
open Unit
open Unit
open Unit
open Unit

This function is deprecated. Deprecated in Java

open Boolean
open Boolean
open Boolean
dispatchUnhandledMove(focused: View, direction: Int)
open Unit
dispatchVisibilityChanged(changedView: View, visibility: Int)
open Unit
open Unit
open Unit
open WindowInsets
open WindowInsetsAnimation.Bounds
open Unit

This function is deprecated. Deprecated in Java

open Unit
open Unit
draw(canvas: Canvas)
open Unit
open Unit
open View
OnBackInvokedDispatcher?
T
<T : View> findViewById(id: Int)
T
<T : View> findViewWithTag(tag: Any)
open Unit
findViewsWithText(
    outViews: ArrayList<View>,
    text: CharSequence,
    flags: Int
)
open Boolean

This function is deprecated. Deprecated in Java

open View
focusSearch(direction: Int)
open Unit
forceHasOverlappingRendering(hasOverlappingRendering: Boolean)
open Unit
open Boolean
open Unit
generateDisplayHash(
    hashAlgorithm: String,
    bounds: Rect?,
    executor: Executor,
    callback: DisplayHashResultCallback
)
open IntArray
open Unit
getDrawingRect(outRect: Rect)
open ArrayList<View>
getFocusables(direction: Int)
open Unit
Boolean
open Boolean
getGlobalVisibleRect(r: Rect, globalOffset: Point)
open Unit
getHitRect(outRect: Rect)
open Int
@ViewDebug.ExportedProperty(category = "layout", mapping = [@ViewDebug.IntToString(from = 0, to = "RESOLVED_DIRECTION_LTR"), @ViewDebug.IntToString(from = 1, to = "RESOLVED_DIRECTION_RTL")])
getLayoutDirection()
Boolean
open Unit
open Unit
open Unit
ViewParent
open ViewParent
open Int
@ViewDebug.ExportedProperty(category = "text", mapping = [@ViewDebug.IntToString(from = 0, to = "INHERIT"), @ViewDebug.IntToString(from = 1, to = "GRAVITY"), @ViewDebug.IntToString(from = 2, to = "TEXT_START"), @ViewDebug.IntToString(from = 3, to = "TEXT_END"), @ViewDebug.IntToString(from = 4, to = "CENTER"), @ViewDebug.IntToString(from = 5, to = "VIEW_START"), @ViewDebug.IntToString(from = 6, to = "VIEW_END")])
getTextAlignment()
open Int
@ViewDebug.ExportedProperty(category = "text", mapping = [@ViewDebug.IntToString(from = 0, to = "INHERIT"), @ViewDebug.IntToString(from = 1, to = "FIRST_STRONG"), @ViewDebug.IntToString(from = 2, to = "ANY_RTL"), @ViewDebug.IntToString(from = 3, to = "LTR"), @ViewDebug.IntToString(from = 4, to = "RTL"), @ViewDebug.IntToString(from = 5, to = "LOCALE"), @ViewDebug.IntToString(from = 6, to = "FIRST_STRONG_LTR"), @ViewDebug.IntToString(from = 7, to = "FIRST_STRONG_RTL")])
getTextDirection()
open Unit
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Unit
open Unit
invalidate(dirty: Rect)

This function is deprecated. Deprecated in Java

open Unit
invalidate(l: Int, t: Int, r: Int, b: Int)

This function is deprecated. Deprecated in Java

open Unit
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Unit
open View
keyboardNavigationClusterSearch(currentCluster: View, direction: Int)
Unit
layout(l: Int, t: Int, r: Int, b: Int)
Unit
measure(widthMeasureSpec: Int, heightMeasureSpec: Int)
open Unit
open Unit
open Unit
open Unit
open WindowInsets
open Unit
open Boolean
open Boolean
open Unit
open Unit
open IntArray
open InputConnection
open Unit
onCreateViewTranslationRequest(
    supportedFormats: IntArray,
    requestsCollector: Consumer<ViewTranslationRequest>
)
open Unit
onCreateVirtualViewTranslationRequests(
    virtualIds: LongArray,
    supportedFormats: IntArray,
    requestsCollector: Consumer<ViewTranslationRequest>
)
open Unit
open Unit
open Boolean
open Unit
Unit
open Boolean
open Unit
open Unit
open Unit
onFocusChanged(
    gainFocus: Boolean,
    direction: Int,
    previouslyFocusedRect: Rect?
)
open Boolean
open Unit
open Boolean
open Unit
open Unit
open Boolean
onKeyPreIme(keyCode: Int, event: KeyEvent)
open Boolean
onKeyShortcut(keyCode: Int, event: KeyEvent)
open Unit
onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)
open Unit
onOverScrolled(
    scrollX: Int,
    scrollY: Int,
    clampedX: Boolean,
    clampedY: Boolean
)
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit
open ContentInfo?
open PointerIcon
onResolvePointerIcon(event: MotionEvent, pointerIndex: Int)
open Unit
open Unit
onRtlPropertiesChanged(layoutDirection: Int)
open Parcelable?
open Unit
onScreenStateChanged(screenState: Int)
open Unit
onScrollCaptureSearch(
    localVisibleRect: Rect,
    windowOffset: Point,
    targets: Consumer<ScrollCaptureTarget>
)
open Unit
onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int)
open Boolean
onSetAlpha(alpha: Int)
open Unit
onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int)
open Unit
open Boolean
open Boolean
open Unit
open Unit
open Unit
open Unit
onVisibilityChanged(changedView: View, visibility: Int)
open Unit
onWindowFocusChanged(hasWindowFocus: Boolean)
open Unit

This function is deprecated. Deprecated in Java

open Unit
open Boolean
overScrollBy(
    deltaX: Int,
    deltaY: Int,
    scrollX: Int,
    scrollY: Int,
    scrollRangeX: Int,
    scrollRangeY: Int,
    maxOverScrollX: Int,
    maxOverScrollY: Int,
    isTouchEvent: Boolean
)
open Boolean
performAccessibilityAction(action: Int, arguments: Bundle?)
open Boolean
open Boolean
open Boolean
open Boolean
performHapticFeedback(feedbackConstant: Int)
open Boolean
performHapticFeedback(feedbackConstant: Int, flags: Int)
open Boolean
open Boolean
open ContentInfo?
open Unit
playSoundEffect(soundConstant: Int)
open Boolean
post(action: Runnable)
open Boolean
postDelayed(action: Runnable, delayMillis: Long)
open Unit
open Unit
postInvalidate(left: Int, top: Int, right: Int, bottom: Int)
open Unit
postInvalidateDelayed(delayMilliseconds: Long)
open Unit
postInvalidateDelayed(
    delayMilliseconds: Long,
    left: Int,
    top: Int,
    right: Int,
    bottom: Int
)
open Unit
open Unit
postInvalidateOnAnimation(left: Int, top: Int, right: Int, bottom: Int)
open Unit
open Unit
postOnAnimationDelayed(action: Runnable, delayMillis: Long)
open Unit
open Unit
open Boolean
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit

This function is deprecated. Deprecated in Java

Boolean
Boolean
requestFocus(direction: Int)
open Boolean
requestFocus(direction: Int, previouslyFocusedRect: Rect)
Boolean
open Unit
open Unit
open Boolean
open Boolean
requestRectangleOnScreen(rectangle: Rect, immediate: Boolean)
Unit
Unit
T
<T : View> requireViewById(id: Int)
open Unit
open Boolean
open Unit
Unit
saveAttributeDataForStyleable(
    context: Context,
    styleable: IntArray,
    attrs: AttributeSet?,
    t: TypedArray,
    defStyleAttr: Int,
    defStyleRes: Int
)
open Unit
open Unit
scrollBy(x: Int, y: Int)
open Unit
scrollTo(x: Int, y: Int)
open Unit
setAccessibilityDataSensitive(accessibilityDataSensitive: Int)
open Unit
setAllowClickWhenDisabled(clickableWhenDisabled: Boolean)
open Unit
open Unit
open Unit
setAutofillHints(vararg autofillHints: String?)
open Unit
open Unit

This function is deprecated. Deprecated in Java

open Unit
open Unit
open Unit
setHandwritingBoundsOffsets(
    offsetLeft: Float,
    offsetTop: Float,
    offsetRight: Float,
    offsetBottom: Float
)
open Unit
setHasTransientState(hasTransientState: Boolean)
open Unit
setIsCredential(isCredential: Boolean)
open Unit
setIsHandwritingDelegate(isHandwritingDelegate: Boolean)
open Unit
open Unit
setLayerType(layerType: Int, paint: Paint?)
Unit
setLeftTopRightBottom(left: Int, top: Int, right: Int, bottom: Int)
Unit
setMeasuredDimension(measuredWidth: Int, measuredHeight: Int)
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit
open Unit
setOnReceiveContentListener(
    mimeTypes: Array<String>?,
    listener: OnReceiveContentListener?
)
open Unit
open Unit

This function is deprecated. Deprecated in Java

open Unit
open Unit
setPadding(left: Int, top: Int, right: Int, bottom: Int)
open Unit
setPaddingRelative(start: Int, top: Int, end: Int, bottom: Int)
open Unit
open Unit
setRenderEffect(renderEffect: RenderEffect?)
Unit
open Unit
open Unit
open Unit
setWillNotCacheDrawing(willNotCacheDrawing: Boolean)

This function is deprecated. Deprecated in Java

open Unit
setWillNotDraw(willNotDraw: Boolean)
open Unit
open Boolean
open Boolean
open ActionMode
open ActionMode
open Unit
Boolean
startDrag(
    data: ClipData,
    shadowBuilder: View.DragShadowBuilder,
    myLocalState: Any,
    flags: Int
)

This function is deprecated. Deprecated in Java

Boolean
startDragAndDrop(
    data: ClipData,
    shadowBuilder: View.DragShadowBuilder,
    myLocalState: Any,
    flags: Int
)
open Boolean
open Unit
open Unit
open Unit
open Unit
Unit
open Boolean
open Boolean

This function is deprecated. Deprecated in Java

open Boolean
@ViewDebug.ExportedProperty(category = "drawing")
willNotDraw()
From android.view.ViewGroup
open Boolean
open Boolean
addViewInLayout(child: View, index: Int, params: ViewGroup.LayoutParams)
open Boolean
addViewInLayout(
    child: View,
    index: Int,
    params: ViewGroup.LayoutParams,
    preventRequestLayout: Boolean
)
open Unit
attachLayoutAnimationParameters(
    child: View,
    params: ViewGroup.LayoutParams,
    index: Int,
    count: Int
)
open Unit
attachViewToParent(child: View, index: Int, params: ViewGroup.LayoutParams)
open Boolean
open Boolean
open Unit
open Unit
open Unit
debug(depth: Int)
open Unit
open Unit
open Unit
open Unit
detachViewsFromParent(start: Int, count: Int)
open Unit
open Unit
open Boolean
drawChild(canvas: Canvas, child: View, drawingTime: Long)
open Unit
open ViewGroup.LayoutParams
open ViewGroup.LayoutParams
open ViewGroup.LayoutParams
open View
getChildAt(index: Int)
Int
getChildDrawingOrder(drawingPosition: Int)
open Int
getChildDrawingOrder(childCount: Int, drawingPosition: Int)
open Boolean
open Int
open Unit
measureChild(
    child: View,
    parentWidthMeasureSpec: Int,
    parentHeightMeasureSpec: Int
)
open Unit
measureChildWithMargins(
    child: View,
    parentWidthMeasureSpec: Int,
    widthUsed: Int,
    parentHeightMeasureSpec: Int,
    heightUsed: Int
)
open Unit
measureChildren(widthMeasureSpec: Int, heightMeasureSpec: Int)
Unit
Unit
open Boolean
open Boolean
open Boolean
onRequestFocusInDescendants(direction: Int, previouslyFocusedRect: Rect)
open Boolean
open Unit
onViewAdded(child: View)
open Unit
open Unit
propagateRequestedFrameRate(frameRate: Float, forceOverride: Boolean)
open Unit
open Unit
open Unit
removeDetachedView(child: View, animate: Boolean)
open Unit
removeViewAt(index: Int)
open Unit
open Unit
removeViews(start: Int, count: Int)
open Unit
removeViewsInLayout(start: Int, count: Int)
open Unit
open Unit
open Unit

This function is deprecated. Deprecated in Java

open Unit
open Unit
open Boolean
open Unit
open Unit
open Unit
From android.view.ViewManager
open Unit
open Unit
From android.view.ViewParent
open Unit
open Unit
open Unit
childHasTransientStateChanged(
    child: View,
    childHasTransientState: Boolean
)
open Unit
open OnBackInvokedDispatcher?
open View
focusSearch(focused: View, direction: Int)
open Unit
open Boolean
getChildVisibleRect(child: View, r: Rect, offset: Point)
Unit
invalidateChild(child: View, dirty: Rect)

This function is deprecated. Deprecated in Java

open ViewParent
invalidateChildInParent(location: IntArray, dirty: Rect)

This function is deprecated. Deprecated in Java

open Unit
notifySubtreeAccessibilityStateChanged(
    child: View,
    source: View,
    changeType: Int
)
open Unit
onDescendantInvalidated(child: View, target: View)
open Boolean
onNestedFling(
    target: View,
    velocityX: Float,
    velocityY: Float,
    consumed: Boolean
)
open Boolean
onNestedPreFling(target: View, velocityX: Float, velocityY: Float)
open Boolean
onNestedPrePerformAccessibilityAction(
    target: View,
    action: Int,
    args: Bundle?
)
open Unit
onNestedPreScroll(target: View, dx: Int, dy: Int, consumed: IntArray)
open Unit
onNestedScroll(
    target: View,
    dxConsumed: Int,
    dyConsumed: Int,
    dxUnconsumed: Int,
    dyUnconsumed: Int
)
open Unit
onNestedScrollAccepted(child: View, target: View, axes: Int)
open Boolean
onStartNestedScroll(child: View, target: View, nestedScrollAxes: Int)
open Unit
open Unit
open Unit
requestChildFocus(child: View, focused: View)
open Boolean
requestChildRectangleOnScreen(
    child: View,
    rectangle: Rect,
    immediate: Boolean
)
open Unit
open Boolean
open Unit
open Boolean
open Boolean
showContextMenuForChild(originalView: View, x: Float, y: Float)
open ActionMode
startActionModeForChild(
    originalView: View,
    callback: ActionMode.Callback
)
open ActionMode
startActionModeForChild(
    originalView: View,
    callback: ActionMode.Callback,
    type: Int
)

Inherited properties

From android.view.View
open View.AccessibilityDelegate
open Int
open AccessibilityNodeProvider
open CharSequence?
open Int
open Int
open String?
open String?
open Float
open Animation
open Matrix?
open IBinder
open MutableMap<IntInt>
open Array<String>?
AutofillId
open Int
open AutofillValue?
open Drawable
open BlendMode?
open ColorStateList?
open PorterDuff.Mode?
open Int
Int
open Float
open Int
open Float
open Rect
Boolean
ContentCaptureSession?
open CharSequence
Int
Context
open ContextMenu.ContextMenuInfo
Boolean
open Display
IntArray
open Bitmap
open Int
open Int
open Long
open Float
open Int
open Boolean
open Boolean
open Int
open Drawable
open Int
open BlendMode?
open ColorStateList?
open PorterDuff.Mode?
open Float
open Handler
open Float
open Float
open Float
open Float
open Int
open Runnable?
Boolean
Int
open Int
open Int
open Drawable?
open Drawable?
open Int
open Int
open Int
open Int
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
Boolean
Boolean
open Boolean
Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
Boolean
Boolean
open Boolean
open Boolean
open Boolean
Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
Boolean
open Boolean
open Boolean
Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open Boolean
open KeyEvent.DispatcherState
open Int
open Int
open Int
open ViewGroup.LayoutParams
Int
open Float
open Int
open Matrix
Int
Int
Int
Int
Int
open Int
open Int
open Int
open Int
open Int
open Int
open Int
open Int
open View.OnFocusChangeListener
open Int
open ViewOutlineProvider
open Int
open Int
open Int
open Int
open Int
open Int
open Int
open Int
final ViewParent
open ViewParent
OutcomeReceiver<GetCredentialResponseGetCredentialException>?
GetCredentialRequest?
open Float
open Float
open PointerIcon
MutableList<Rect>
open Array<String>?
open Float
open Resources
Boolean
Int
open Float
open Int
open AttachedSurfaceControl?
open View
open WindowInsets
open Float
open Float
open Float
open Float
open Float
open Int
open Int
open Int
open Int
open Int
open Int
Int
Int
open Int
open Int
CharSequence?
open StateListAnimator
open Int
open Int
open CharSequence?
open MutableList<Rect>
open Int
open Any
open Int
open Int
open CharSequence?
Int
open Float
open Int
open TouchDelegate
open ArrayList<View>
open Float
open String
open Float
open Float
open Float
open Long
open Int
open Int
open Drawable?
open Drawable?
open Int
open ViewTranslationResponse?
open ViewTreeObserver
open Int
Int
open Int
open WindowId
open WindowInsetsController?
open Int
open IBinder
open Int
open Float
open Float
open Float
From android.view.ViewGroup

Public constructors

LowLatencyCanvasView

Added in 1.0.4
LowLatencyCanvasView(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0
)

Public functions

addView

open fun addView(child: View?): Unit

addView

open fun addView(child: View?, index: Int): Unit

addView

open fun addView(child: View?, params: ViewGroup.LayoutParams?): Unit

addView

open fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?): Unit

addView

open fun addView(child: View?, width: Int, height: Int): Unit

cancel

Added in 1.0.4
fun cancel(): Unit

Cancels any in progress request to render to the front buffer and hides the front buffered overlay. Cancellation is a "best-effort" approach and any in progress rendering will still be applied.

clear

Added in 1.0.4
fun clear(): Unit

Clears the content of the buffer and hides the front buffered overlay. This will cancel all pending requests to render. This is similar to cancel, however in addition to cancelling the pending render requests, this also clears the contents of the buffer. Similar to commit this will also hide the front buffered overlay.

commit

Added in 1.0.4
fun commit(): Unit

Invalidates this View and draws the buffer within View#onDraw. This will synchronously hide the front buffered overlay when drawing the buffer to this View. Consumers are encouraged to invoke this method when a user gesture that requires low latency rendering is complete. For example in response to a MotionEvent.ACTION_UP event in an implementation of View.onTouchEvent.

execute

Added in 1.0.4
fun execute(runnable: Runnable): Unit

Dispatches a runnable to be executed on the background rendering thread. This is useful for updating data structures used to issue drawing instructions on the same thread that Callback.onDrawFrontBufferedLayer is invoked on.

renderFrontBufferedLayer

Added in 1.0.4
fun renderFrontBufferedLayer(): Unit

Render content to the front buffered layer. This triggers a call to Callback.onDrawFrontBufferedLayer. Callback implementations can also configure the corresponding SurfaceControlCompat.Transaction that updates the contents on screen by implementing the optional Callback.onFrontBufferedLayerRenderComplete callback

setRenderCallback

Added in 1.0.4
fun setRenderCallback(callback: LowLatencyCanvasView.Callback?): Unit

Configures the Callback used to render contents to the front buffered overlay as well as optionally configuring the SurfaceControlCompat.Transaction used to update contents on screen.

Protected functions

onAttachedToWindow

protected open fun onAttachedToWindow(): Unit

onDraw

protected open fun onDraw(canvas: Canvas): Unit

onLayout

protected open fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int): Unit