FileDocCategorySizeDatePackage
SurfaceHolder.javaAPI DocAndroid 1.5 API12147Wed May 06 22:41:56 BST 2009android.view

SurfaceHolder

public interface SurfaceHolder
Abstract interface to someone holding a display surface. Allows you to control the surface size and format, edit the pixels in the surface, and monitor changes to the surface. This interface is typically available through the {@link SurfaceView} class.

When using this interface from a thread different than the one running its {@link SurfaceView}, you will want to carefully read the {@link #lockCanvas} and {@link Callback#surfaceCreated Callback.surfaceCreated}.

Fields Summary
public static final int
SURFACE_TYPE_NORMAL
Surface type: creates a regular surface, usually in main, non contiguous, cached/buffered RAM.
public static final int
SURFACE_TYPE_HARDWARE
Surface type: creates a suited to be used with DMA engines and hardware accelerators.
public static final int
SURFACE_TYPE_GPU
Surface type: creates a surface suited to be used with the GPU
public static final int
SURFACE_TYPE_PUSH_BUFFERS
Surface type: creates a "push" surface, that is a surface that doesn't owns its buffers. With such a surface lockCanvas will fail.
Constructors Summary
Methods Summary
public voidaddCallback(android.view.SurfaceHolder$Callback callback)
Add a Callback interface for this holder. There can several Callback interfaces associated to a holder.

param
callback The new Callback interface.

public SurfacegetSurface()
Direct access to the surface object. The Surface may not always be available -- for example when using a {@link SurfaceView} the holder's Surface is not created until the view has been attached to the window manager and performed a layout in order to determine the dimensions and screen position of the Surface. You will thus usually need to implement {@link Callback#surfaceCreated Callback.surfaceCreated} to find out when the Surface is available for use.

Note that if you directly access the Surface from another thread, it is critical that you correctly implement {@link Callback#surfaceCreated Callback.surfaceCreated} and {@link Callback#surfaceDestroyed Callback.surfaceDestroyed} to ensure that thread only accesses the Surface while it is valid, and that the Surface does not get destroyed while the thread is using it.

This method is intended to be used by frameworks which often need direct access to the Surface object (usually to pass it to native code). When designing APIs always use SurfaceHolder to pass surfaces around as opposed to the Surface object itself. A rule of thumb is that application code should never have to call this method.

return
Surface The surface.

public android.graphics.RectgetSurfaceFrame()
Retrieve the current size of the surface. Note: do not modify the returned Rect. This is only safe to call from the thread of {@link SurfaceView}'s window, or while inside of {@link #lockCanvas()}.

return
Rect The surface's dimensions. The left and top are always 0.

public booleanisCreating()
Use this method to find out if the surface is in the process of being created from Callback methods. This is intended to be used with {@link Callback#surfaceChanged}.

return
true if the surface is in the process of being created.

public android.graphics.CanvaslockCanvas(android.graphics.Rect dirty)
Just like {@link #lockCanvas()} but allows to specify a dirty rectangle. Every pixel within that rectangle must be written; however pixels outside the dirty rectangle will be preserved by the next call to lockCanvas().

see
android.view.SurfaceHolder#lockCanvas
param
dirty Area of the Surface that will be modified.
return
Canvas Use to draw into the surface.

public android.graphics.CanvaslockCanvas()
Start editing the pixels in the surface. The returned Canvas can be used to draw into the surface's bitmap. A null is returned if the surface has not been created or otherwise can not be edited. You will usually need to implement {@link Callback#surfaceCreated Callback.surfaceCreated} to find out when the Surface is available for use.

The content of the Surface is never preserved between unlockCanvas() and lockCanvas(), for this reason, every pixel within the Surface area must be written. The only exception to this rule is when a dirty rectangle is specified, in which case, non dirty pixels will be preserved.

If you call this repeatedly when the Surface is not ready (before {@link Callback#surfaceCreated Callback.surfaceCreated} or after {@link Callback#surfaceDestroyed Callback.surfaceDestroyed}), your calls will be throttled to a slow rate in order to avoid consuming CPU.

If null is not returned, this function internally holds a lock until the corresponding {@link #unlockCanvasAndPost} call, preventing {@link SurfaceView} from creating, destroying, or modifying the surface while it is being drawn. This can be more convenience than accessing the Surface directly, as you do not need to do special synchronization with a drawing thread in {@link Callback#surfaceDestroyed Callback.surfaceDestroyed}.

return
Canvas Use to draw into the surface.

public voidremoveCallback(android.view.SurfaceHolder$Callback callback)
Removes a previously added Callback interface from this holder.

param
callback The Callback interface to remove.

public voidsetFixedSize(int width, int height)
Make the surface a fixed size. It will never change from this size. When working with a {link SurfaceView}, this must be called from the same thread running the SurfaceView's window.

param
width The surface's width.
param
height The surface's height.

public voidsetFormat(int format)
Set the desired PixelFormat of the surface. The default is OPAQUE. When working with a {link SurfaceView}, this must be called from the same thread running the SurfaceView's window.

param
format A constant from PixelFormat.
see
android.graphics.PixelFormat

public voidsetKeepScreenOn(boolean screenOn)
Enable or disable option to keep the screen turned on while this surface is displayed. The default is false, allowing it to turn off. Enabling the option effectivelty. This is safe to call from any thread.

param
screenOn Supply to true to force the screen to stay on, false to allow it to turn off.

public voidsetSizeFromLayout()
Allow the surface to resized based on layout of its container (this is the default). When this is enabled, you should monitor {@link Callback#surfaceChanged} for changes to the size of the surface. When working with a {link SurfaceView}, this must be called from the same thread running the SurfaceView's window.

public voidsetType(int type)
Sets the surface's type. Surfaces intended to be used with OpenGL ES should be of SURFACE_TYPE_GPU, surfaces accessed by DMA engines and hardware accelerators should be of type SURFACE_TYPE_HARDWARE. Failing to set the surface's type appropriately could result in degraded performance or failure.

param
type The surface's memory type.

public voidunlockCanvasAndPost(android.graphics.Canvas canvas)
Finish editing pixels in the surface. After this call, the surface's current pixels will be shown on the screen, but its content is lost, in particular there is no guarantee that the content of the Surface will remain unchanged when lockCanvas() is called again.

see
#lockCanvas()
param
canvas The Canvas previously returned by lockCanvas().