Xamarin.Android TextureView
The TextureView
class is a view that uses hardware-accelerated
2D rendering to enable a video or OpenGL content stream to be displayed. For
example, the following screenshot shows the TextureView
displaying
a live feed from the device's camera:
Unlike the SurfaceView
class, which can also be used to display
OpenGL or video content, the TextureView is not rendered into a separate window.
Therefore, TextureView
is able to support view transformations like
any other view. For example, rotating a TextureView
can be
accomplished by simply setting its Rotation
property, its
transparency by setting its Alpha
property, and so on.
Therefore, with the TextureView
we can now do things like
display a live stream from the camera and transform it, as shown in the
following code:
public class TextureViewActivity : Activity,
TextureView.ISurfaceTextureListener
{
Camera _camera;
TextureView _textureView;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
_textureView = new TextureView (this);
_textureView.SurfaceTextureListener = this;
SetContentView (_textureView);
}
public void OnSurfaceTextureAvailable (
Android.Graphics.SurfaceTexture surface,
int width, int height)
{
_camera = Camera.Open ();
var previewSize = _camera.GetParameters ().PreviewSize;
_textureView.LayoutParameters =
new FrameLayout.LayoutParams (previewSize.Width,
previewSize.Height, (int)GravityFlags.Center);
try {
_camera.SetPreviewTexture (surface);
_camera.StartPreview ();
} catch (Java.IO.IOException ex) {
Console.WriteLine (ex.Message);
}
// this is the sort of thing TextureView enables
_textureView.Rotation = 45.0f;
_textureView.Alpha = 0.5f;
}
…
}
The above code creates a TextureView
instance in the Activity's
OnCreate
method and sets the Activity as the TextureView
's
SurfaceTextureListener
. To be the SurfaceTextureListener
, the
Activity implements the TextureView.ISurfaceTextureListener
interface. The system will call the OnSurfaceTextAvailable
method
when the SurfaceTexture
is ready for use. In this method, we take the
SurfaceTexture
that is passed in and set it to the camera's preview
texture. Then we are free to perform normal view-based operations, such
as setting the Rotation
and Alpha
, as in the example above. The
resulting application, running on a device, is shown below:
To use the TextureView
, hardware acceleration must be enabled, which
it will be by default as of API Level 14. Also, since this example uses
the camera, both the android.permission.CAMERA
permission and the
android.hardware.camera
feature must be set in the
AndroidManifest.xml.