Compartir a través de


TextureView de Xamarin.Android

La clase TextureView es una vista que usa la representación 2D acelerada por hardware para permitir que se muestren secuencias de contenido de OpenGL o vídeo. Por ejemplo, en la siguiente captura de pantalla TextureView muestra una fuente en directo desde la cámara del dispositivo:

Recorte de pantalla de ejemplo de una imagen activa desde la cámara del dispositivo

A diferencia de la clase SurfaceView, que también se puede usar para mostrar el contenido de OpenGL o vídeo, TextureView no se representa en una ventana independiente. Por consiguiente, TextureView es capaz de admitir las transformaciones de vista como cualquier otra vista. Por ejemplo, la rotación de TextureView se puede realizar simplemente estableciendo su propiedad Rotation, su transparencia estableciendo su propiedad Alpha, etc.

Por tanto, con TextureView ahora podemos realizar operaciones tales como mostrar streaming en vivo desde la cámara y transformarla, como se muestra en el código siguiente:

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;
    }
    …
}

El código anterior crea una instancia de TextureView en el método OnCreate de Activity y establece Activity como SurfaceTextureListener de TextureView. Para ser SurfaceTextureListener, la actividad implementa la interfaz de TextureView.ISurfaceTextureListener. El sistema llamará al método OnSurfaceTextAvailable cuando SurfaceTexture esté listo para su uso. En este método, usamos la clase SurfaceTexture que se pasa y lo establecemos en la textura de la vista previa de la cámara. Luego, podemos realizar las operaciones normales basadas en la vista, como establecer Rotation y Alpha, como en el ejemplo anterior. La aplicación resultante, que se ejecuta en un dispositivo, se muestra a continuación:

Ejemplo de la aplicación en ejecución en un dispositivo mostrando una imagen

Para usar TextureView, debe estar habilitada la aceleración de hardware, algo que se realizará de forma predeterminada a partir del nivel 14 de la API. Además, dado que en este ejemplo se usa la cámara, tanto el permiso android.permission.CAMERA como la característica android.hardware.camera deben establecerse en AndroidManifest.xml.