Added in API level 1

SurfaceView


open class SurfaceView : View
kotlin.Any
   ↳ android.view.View
   ↳ android.view.SurfaceView

Provides a dedicated drawing surface embedded inside of a view hierarchy. You can control the format of this surface and, if you like, its size; the SurfaceView takes care of placing the surface at the correct location on the screen

The surface is Z ordered so that it is behind the window holding its SurfaceView; the SurfaceView punches a hole in its window to allow its surface to be displayed. The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it. This can be used to place overlays such as buttons on top of the Surface, though note however that it can have an impact on performance since a full alpha-blended composite will be performed each time the Surface changes.

The transparent region that makes the surface visible is based on the layout positions in the view hierarchy. If the post-layout transform properties are used to draw a sibling view on top of the SurfaceView, the view may not be properly composited with the surface.

Access to the underlying surface is provided via the SurfaceHolder interface, which can be retrieved by calling getHolder.

The Surface will be created for you while the SurfaceView's window is visible; you should implement SurfaceHolder.Callback.surfaceCreated and SurfaceHolder.Callback.surfaceDestroyed to discover when the Surface is created and destroyed as the window is shown and hidden.

One of the purposes of this class is to provide a surface in which a secondary thread can render into the screen. If you are going to use it this way, you need to be aware of some threading semantics:

Note: Starting in platform version android.os.Build.VERSION_CODES#N, SurfaceView's window position is updated synchronously with other View rendering. This means that translating and scaling a SurfaceView on screen will not cause rendering artifacts. Such artifacts may occur on previous versions of the platform when its window is positioned asynchronously.

Note: Starting in platform version android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE, SurfaceView will support arbitrary alpha blending. Prior platform versions ignored alpha values on the SurfaceView if they were between 0 and 1. If the SurfaceView has a composition order greater than or equal to 0, (see setCompositionOrder(int)), then the alpha is applied directly to the Surface. If the SurfaceView has a composition order less than 0, then the alpha is applied to the hole punch directly. Note that when the composition order is below the window overlapping SurfaceViews may not blend properly as a consequence of not applying alpha to the surface content directly.

Summary

Inherited XML attributes
Constants
static Int

Default lifecycle of the Surface owned by this SurfaceView.

static Int

The Surface lifecycle is tied to SurfaceView attachment.

static Int

The Surface lifecycle is tied to SurfaceView visibility.

Inherited constants
Public constructors
SurfaceView(context: Context!)

SurfaceView(context: Context!, attrs: AttributeSet!)

SurfaceView(context: Context!, attrs: AttributeSet!, defStyleAttr: Int)

SurfaceView(context: Context!, attrs: AttributeSet!, defStyleAttr: Int, defStyleRes: Int)

Public methods
open Unit

Adds a transaction that would be applied synchronously with displaying the SurfaceView's next frame.

open Unit

Clears the SurfaceControlViewHost.SurfacePackage that was set on this SurfaceView.

open Unit
draw(canvas: Canvas)

Manually render this view (and all of its children) to the given Canvas.

open Boolean

This is used by the ViewRoot to perform an optimization when the view hierarchy contains one or several SurfaceView.

open CharSequence!

Return the class name of this object to be used for accessibility purposes.

open SurfaceControlViewHost.SurfacePackage?

Returns the SurfaceControlViewHost.SurfacePackage that was set on this SurfaceView.

open Int

Returns the composition order of the SurfaceView.

open SurfaceHolder!

Return the SurfaceHolder providing access and control over this SurfaceView's underlying surface.

open IBinder?

A token used for constructing SurfaceControlViewHost.

open Int

Gets the mode for determining whether this View is important for accessibility.

open SurfaceControl!

Return a SurfaceControl which can be used for parenting Surfaces to this SurfaceView.

open Boolean

Returns whether this View has content which overlaps.

open Unit
setAlpha(alpha: Float)

If the SurfaceView has a composition order greater than or equal to 0, (see setCompositionOrder(int)), the alpha value set is applied directly to the Surface's content.

open Unit

Displays the view-hierarchy embedded within a SurfaceControlViewHost.SurfacePackage within this SurfaceView.

open Unit
setClipBounds(clipBounds: Rect!)

Sets a rectangular area on this view to which the view will be clipped when it is drawn.

open Unit
setCompositionOrder(compositionOrder: Int)

Controls the composition order of the SurfaceView.

open Unit
setDesiredHdrHeadroom(desiredHeadroom: Float)

Sets the desired amount of HDR headroom to be used when HDR content is presented on this SurfaceView.

open Unit
setSecure(isSecure: Boolean)

Control whether the surface view's content should be treated as secure, preventing it from appearing in screenshots or from being viewed on non-secure displays.

open Unit
setSurfaceLifecycle(lifecycleStrategy: Int)

Controls the lifecycle of the Surface owned by this SurfaceView.

open Unit
setVisibility(visibility: Int)

Set the visibility state of this view.

open Unit
setZOrderMediaOverlay(isMediaOverlay: Boolean)

Control whether the surface view's surface is placed on top of another regular surface view in the window (but still behind the window itself).

open Unit

Control whether the surface view's surface is placed on top of its window.

Protected methods
open Unit

Called by draw to draw the child views.

open Unit

This is called when the view is attached to a window.

open Unit

This is called when the view is detached from a window.

open Unit
onFocusChanged(gainFocus: Boolean, direction: Int, previouslyFocusedRect: Rect?)

Called by the view system when the focus state of this view changes.

open Unit
onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)

Measure the view and its content to determine the measured width and the measured height.

open Boolean
onSetAlpha(alpha: Int)

Invoked if there is a Transform that involves alpha.

open Unit

Called when the window containing has change its visibility (between GONE, INVISIBLE, and VISIBLE).

Inherited functions
Inherited properties

Constants

SURFACE_LIFECYCLE_DEFAULT

Added in API level 34
static val SURFACE_LIFECYCLE_DEFAULT: Int

Default lifecycle of the Surface owned by this SurfaceView. The default lifecycle matches SURFACE_LIFECYCLE_FOLLOWS_VISIBILITY.

Value: 0

SURFACE_LIFECYCLE_FOLLOWS_ATTACHMENT

Added in API level 34
static val SURFACE_LIFECYCLE_FOLLOWS_ATTACHMENT: Int

The Surface lifecycle is tied to SurfaceView attachment. The Surface is created when the SurfaceView first becomes attached, but is not destroyed until this SurfaceView has been detached from the current window.

Value: 2

SURFACE_LIFECYCLE_FOLLOWS_VISIBILITY

Added in API level 34
static val SURFACE_LIFECYCLE_FOLLOWS_VISIBILITY: Int

The Surface lifecycle is tied to SurfaceView visibility. The Surface is created when the SurfaceView becomes visible, and is destroyed when the SurfaceView is no longer visible.

Value: 1

Public constructors

SurfaceView

Added in API level 1
SurfaceView(context: Context!)

SurfaceView

Added in API level 1
SurfaceView(
    context: Context!,
    attrs: AttributeSet!)

SurfaceView

Added in API level 1
SurfaceView(
    context: Context!,
    attrs: AttributeSet!,
    defStyleAttr: Int)

SurfaceView

Added in API level 21
SurfaceView(
    context: Context!,
    attrs: AttributeSet!,
    defStyleAttr: Int,
    defStyleRes: Int)

Public methods

applyTransactionToFrame

Added in API level 34
open fun applyTransactionToFrame(transaction: SurfaceControl.Transaction): Unit

Adds a transaction that would be applied synchronously with displaying the SurfaceView's next frame. Note that the exact frame that the transaction is applied with is only well-defined when SurfaceView rendering is paused prior to calling applyTransactionToFrame(), so that the transaction is applied with the next frame rendered after applyTransactionToFrame() is called. If frames are continuously rendering to the SurfaceView when applyTransactionToFrame() is called, then it is undefined which frame the transaction is applied with. It is also possible for the transaction to not be applied if no new frames are rendered to the SurfaceView after this is called.

Parameters
transaction SurfaceControl.Transaction: The transaction to apply. The system takes ownership of the transaction and promises to eventually apply the transaction.
This value cannot be null.
Exceptions
java.lang.IllegalStateException if the underlying Surface does not exist (and therefore there is no next frame).

clearChildSurfacePackage

Added in API level 36
open fun clearChildSurfacePackage(): Unit

Clears the SurfaceControlViewHost.SurfacePackage that was set on this SurfaceView. This hides any content rendered by the provided SurfaceControlViewHost.SurfacePackage.

draw

Added in API level 1
open fun draw(canvas: Canvas): Unit

Manually render this view (and all of its children) to the given Canvas. The view must have already done a full layout before this function is called. When implementing a view, implement onDraw(android.graphics.Canvas) instead of overriding this method. If you do need to override this method, call the superclass version.
If you override this method you must call through to the superclass implementation.

Parameters
canvas Canvas: The Canvas to which the View is rendered.
This value cannot be null.

gatherTransparentRegion

Added in API level 1
open fun gatherTransparentRegion(region: Region?): Boolean

This is used by the ViewRoot to perform an optimization when the view hierarchy contains one or several SurfaceView. SurfaceView is always considered transparent, but its children are not, therefore all View objects remove themselves from the global transparent region (passed as a parameter to this function).

Parameters
region Region?: The transparent region for this ViewAncestor (window).
This value may be null.
Return
Boolean Returns true if the effective visibility of the view at this point is opaque, regardless of the transparent region; returns false if it is possible for underlying windows to be seen behind the view.

getAccessibilityClassName

Added in API level 23
open fun getAccessibilityClassName(): CharSequence!

Return the class name of this object to be used for accessibility purposes. Subclasses should only override this if they are implementing something that should be seen as a completely new class of view when used by accessibility, unrelated to the class it is deriving from. This is used to fill in AccessibilityNodeInfo.setClassName.

getChildSurfacePackage

Added in API level 36
open fun getChildSurfacePackage(): SurfaceControlViewHost.SurfacePackage?

Returns the SurfaceControlViewHost.SurfacePackage that was set on this SurfaceView. Note: This method will return null if setChildSurfacePackage(android.view.SurfaceControlViewHost.SurfacePackage) has not been called or if clearChildSurfacePackage() has been called.

getCompositionOrder

Added in API level 36
open fun getCompositionOrder(): Int

Returns the composition order of the SurfaceView.

Return
Int composition order of the SurfaceView.

getHolder

Added in API level 1
open fun getHolder(): SurfaceHolder!

Return the SurfaceHolder providing access and control over this SurfaceView's underlying surface.

Return
SurfaceHolder! SurfaceHolder The holder of the surface.

getHostToken

Added in API level 30
Deprecated in API level 35
open fun getHostToken(): IBinder?

Deprecated: Use AttachedSurfaceControl.getInputTransferToken() instead.

A token used for constructing SurfaceControlViewHost. This token should be passed from the host process to the client process.

Return
IBinder? The token.
This value may be null.

getImportantForAccessibility

Added in API level 16
open fun getImportantForAccessibility(): Int

Gets the mode for determining whether this View is important for accessibility. A view is important for accessibility if it fires accessibility events and if it is reported to accessibility services that query the screen.

Return
Int The mode for determining whether a view is important for accessibility, one of IMPORTANT_FOR_ACCESSIBILITY_AUTO, IMPORTANT_FOR_ACCESSIBILITY_YES, IMPORTANT_FOR_ACCESSIBILITY_NO, or IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS.

getSurfaceControl

Added in API level 29
open fun getSurfaceControl(): SurfaceControl!

Return a SurfaceControl which can be used for parenting Surfaces to this SurfaceView. Note that this SurfaceControl is effectively read-only. Its only well-defined usage is in using the SurfaceControl as a parent for an application's hierarchy of SurfaceControls. All other properties of the SurfaceControl, such as its position, may be mutated by the SurfaceView at any time which will override what the application is requesting. Do not apply any SurfaceControl.Transaction to this SurfaceControl except for reparenting child SurfaceControls. See: SurfaceControl.Transaction.reparent. The SurfaceControl lifetime follows the SurfaceView's Surface lifetime. You should implement SurfaceHolder.Callback.surfaceCreated and SurfaceHolder.Callback.surfaceDestroyed to discover when the SurfaceControl is valid. Outside of that, a null SurfaceControl will be returned.

Return
SurfaceControl! The SurfaceControl for this SurfaceView.

hasOverlappingRendering

Added in API level 16
open fun hasOverlappingRendering(): Boolean

Returns whether this View has content which overlaps.

This function, intended to be overridden by specific View types, is an optimization when alpha is set on a view. If rendering overlaps in a view with alpha < 1, that view is drawn to an offscreen buffer and then composited into place, which can be expensive. If the view has no overlapping rendering, the view can draw each primitive with the appropriate alpha value directly. An example of overlapping rendering is a TextView with a background image, such as a Button. An example of non-overlapping rendering is a TextView with no background, or an ImageView with only the foreground image. The default implementation returns true; subclasses should override if they have cases which can be optimized.

Note: The return value of this method is ignored if forceHasOverlappingRendering(boolean) has been called on this view.

Return
Boolean true if the content in this view might overlap, false otherwise.

setAlpha

Added in API level 11
open fun setAlpha(alpha: Float): Unit

If the SurfaceView has a composition order greater than or equal to 0, (see setCompositionOrder(int)), the alpha value set is applied directly to the Surface's content. This allows for proper alpha blending of the SurfaceView's content with whatever is behind it. If a SurfaceControlViewHost.SurfacePackage is set, the alpha value is applied to the contents of the SurfacePackage as well.

When the SurfaceView composition order less than 0, the alpha value applied directly to the transparent region used to expose the SurfaceView's content. An alpha value of 0 means the "hole punch" region is completely transparent while an alpha value of 1 means the region is completely opaque. The alpha value will not be applied to the SurfaceView's content directly or on the SurfaceControlViewHost.SurfacePackage. Note that when the composition order is below the window overlapping SurfaceViews may not blend properly as a consequence of not applying alpha to the surface content directly.

Parameters
alpha Float: the alpha value to set on the SurfaceView

See Also

    setChildSurfacePackage

    Added in API level 30
    open fun setChildSurfacePackage(p: SurfaceControlViewHost.SurfacePackage): Unit

    Displays the view-hierarchy embedded within a SurfaceControlViewHost.SurfacePackage within this SurfaceView. This can be called independently of the SurfaceView lifetime callbacks. SurfaceView will internally manage reparenting the package to our Surface as it is created and destroyed. If this SurfaceView is above its host Surface (see setZOrderOnTop then the embedded Surface hierarchy will be able to receive input. This will take ownership of the SurfaceControl contained inside the SurfacePackage and free the caller of the obligation to call SurfaceControlViewHost.SurfacePackage.release. However, note that SurfaceControlViewHost.SurfacePackage.release and SurfaceControlViewHost.release are not the same. While the ownership of this particular SurfaceControlViewHost.SurfacePackage will be taken by the SurfaceView the underlying SurfaceControlViewHost remains managed by it's original remote-owner. Users can call SurfaceView.clearChildSurfacePackage to clear the package.

    Parameters
    p SurfaceControlViewHost.SurfacePackage: The SurfacePackage to embed.
    This value cannot be null.

    setClipBounds

    Added in API level 18
    open fun setClipBounds(clipBounds: Rect!): Unit

    Sets a rectangular area on this view to which the view will be clipped when it is drawn. Setting the value to null will remove the clip bounds and the view will draw normally, using its full bounds.

    Parameters
    clipBounds Rect!: The rectangular area, in the local coordinates of this view, to which future drawing operations will be clipped.

    setCompositionOrder

    Added in API level 36
    open fun setCompositionOrder(compositionOrder: Int): Unit

    Controls the composition order of the SurfaceView. A non-negative composition order value indicates that the SurfaceView is composited on top of the parent window, while a negative composition order indicates that the SurfaceView is behind the parent window. A SurfaceView with a higher value appears above its peers with lower values. For SurfaceViews with the same composition order value, their relative order is undefined.

    Parameters
    compositionOrder Int: the composition order of the surface view.

    setDesiredHdrHeadroom

    Added in API level 35
    open fun setDesiredHdrHeadroom(desiredHeadroom: Float): Unit

    Sets the desired amount of HDR headroom to be used when HDR content is presented on this SurfaceView. This is expressed as the ratio of maximum HDR white point over the SDR white point, not as absolute nits.

    By default the system will choose an amount of HDR headroom that is appropriate for the underlying device capabilities & bit-depth of the panel. However, for some types of content this can end up being more headroom than necessary or desired. An example would be a messaging app or gallery thumbnail view where some amount of HDR pop is desired without overly influencing the perceived brightness of the majority SDR content. This can also be used to animate in/out of an HDR range for smoother transitions.

    Note: The actual amount of HDR headroom that will be given is subject to a variety of factors such as ambient conditions, display capabilities, or bit-depth limitations. See Display.getHdrSdrRatio() for more information as well as how to query the current value.

    Note: This API operates independently of both the Widow color mode and the Window desiredHdrHeadroom

    Parameters
    desiredHeadroom Float: The amount of HDR headroom that is desired. Must be >= 1.0 (no HDR) and <= 10,000.0. Passing 0.0 will reset to the default, automatically chosen value.
    Value is between 0.0f and 10000.0f inclusive

    setSecure

    Added in API level 17
    open fun setSecure(isSecure: Boolean): Unit

    Control whether the surface view's content should be treated as secure, preventing it from appearing in screenshots or from being viewed on non-secure displays.

    Note that this must be set before the surface view's containing window is attached to the window manager.

    See android.view.Display#FLAG_SECURE for details.

    Parameters
    isSecure Boolean: True if the surface view is secure.

    setSurfaceLifecycle

    Added in API level 34
    open fun setSurfaceLifecycle(lifecycleStrategy: Int): Unit

    Controls the lifecycle of the Surface owned by this SurfaceView.

    By default, the lifecycycle strategy employed by the SurfaceView is SURFACE_LIFECYCLE_DEFAULT.

    Parameters
    lifecycleStrategy Int: The strategy for the lifecycle of the Surface owned by this SurfaceView.
    Value is one of the following:

    setVisibility

    Added in API level 1
    open fun setVisibility(visibility: Int): Unit

    Set the visibility state of this view.

    Parameters
    visibility Int: One of VISIBLE, INVISIBLE, or GONE.
    Value is one of the following:

    setZOrderMediaOverlay

    Added in API level 5
    open fun setZOrderMediaOverlay(isMediaOverlay: Boolean): Unit

    Control whether the surface view's surface is placed on top of another regular surface view in the window (but still behind the window itself). This is typically used to place overlays on top of an underlying media surface view.

    Note that this must be set before the surface view's containing window is attached to the window manager.

    Calling this overrides any previous call to setZOrderOnTop.

    setZOrderOnTop

    Added in API level 5
    open fun setZOrderOnTop(onTop: Boolean): Unit

    Control whether the surface view's surface is placed on top of its window. Normally it is placed behind the window, to allow it to (for the most part) appear to composite with the views in the hierarchy. By setting this, you cause it to be placed above the window. This means that none of the contents of the window this SurfaceView is in will be visible on top of its surface.

    Note that this must be set before the surface view's containing window is attached to the window manager. If you target Build.VERSION_CODES.R the Z ordering can be changed dynamically if the backing surface is created, otherwise it would be applied at surface construction time.

    Calling this overrides any previous call to setZOrderMediaOverlay.

    Parameters
    onTop Boolean: Whether to show the surface on top of this view's window.

    Protected methods

    dispatchDraw

    Added in API level 1
    protected open fun dispatchDraw(canvas: Canvas): Unit

    Called by draw to draw the child views. This may be overridden by derived classes to gain control just before its children are drawn (but after its own view has been drawn).

    Parameters
    canvas Canvas: the canvas on which to draw the view.
    This value cannot be null.

    onAttachedToWindow

    Added in API level 1
    protected open fun onAttachedToWindow(): Unit

    This is called when the view is attached to a window. At this point it has a Surface and will start drawing. Note that this function is guaranteed to be called before onDraw(android.graphics.Canvas), however it may be called any time before the first onDraw -- including before or after onMeasure(int,int).
    If you override this method you must call through to the superclass implementation.

    onDetachedFromWindow

    Added in API level 1
    protected open fun onDetachedFromWindow(): Unit

    This is called when the view is detached from a window. At this point it no longer has a surface for drawing.
    If you override this method you must call through to the superclass implementation.

    onFocusChanged

    Added in API level 1
    protected open fun onFocusChanged(
        gainFocus: Boolean,
        direction: Int,
        previouslyFocusedRect: Rect?
    ): Unit

    Called by the view system when the focus state of this view changes. When the focus change event is caused by directional navigation, direction and previouslyFocusedRect provide insight into where the focus is coming from. When overriding, be sure to call up through to the super class so that the standard focus handling will occur.
    If you override this method you must call through to the superclass implementation.

    Parameters
    gainFocus Boolean: True if the View has focus; false otherwise.
    direction Int: Value is one of the following:
    previouslyFocusedRect Rect?: This value may be null.

    onMeasure

    Added in API level 1
    protected open fun onMeasure(
        widthMeasureSpec: Int,
        heightMeasureSpec: Int
    ): Unit

    Measure the view and its content to determine the measured width and the measured height. This method is invoked by measure(int,int) and should be overridden by subclasses to provide accurate and efficient measurement of their contents.

    CONTRACT: When overriding this method, you must call setMeasuredDimension(int,int) to store the measured width and height of this view. Failure to do so will trigger an IllegalStateException, thrown by measure(int,int). Calling the superclass' onMeasure(int,int) is a valid use.

    The base class implementation of measure defaults to the background size, unless a larger size is allowed by the MeasureSpec. Subclasses should override onMeasure(int,int) to provide better measurements of their content.

    If this method is overridden, it is the subclass's responsibility to make sure the measured height and width are at least the view's minimum height and width (getSuggestedMinimumHeight() and getSuggestedMinimumWidth()).

    Parameters
    widthMeasureSpec Int: horizontal space requirements as imposed by the parent. The requirements are encoded with android.view.View.MeasureSpec.
    heightMeasureSpec Int: vertical space requirements as imposed by the parent. The requirements are encoded with android.view.View.MeasureSpec.

    onSetAlpha

    Added in API level 1
    protected open fun onSetAlpha(alpha: Int): Boolean

    Invoked if there is a Transform that involves alpha. Subclass that can draw themselves with the specified alpha should return true, and then respect that alpha when their onDraw() is called. If this returns false then the view may be redirected to draw into an offscreen buffer to fulfill the request, which will look fine, but may be slower than if the subclass handles it internally. The default implementation returns false.

    Parameters
    alpha Int: The alpha (0..255) to apply to the view's drawing
    Return
    Boolean true if the view can draw with the specified alpha.

    onWindowVisibilityChanged

    Added in API level 1
    protected open fun onWindowVisibilityChanged(visibility: Int): Unit

    Called when the window containing has change its visibility (between GONE, INVISIBLE, and VISIBLE). Note that this tells you whether or not your window is being made visible to the window manager; this does not tell you whether or not your window is obscured by other windows on the screen, even if it is itself visible.

    Parameters
    visibility Int: The new visibility of the window.
    Value is one of the following: