Android - TextureView

Se desideri visualizzare un flusso video in diretta o qualsiasi flusso di contenuto come un video o una scena OpenGL, puoi utilizzare TextureView fornito da Android per farlo.

Per utilizzare TextureView, tutto ciò che devi fare è ottenere la sua SurfaceTexture, che può quindi essere utilizzata per il rendering del contenuto. Per fare ciò, è sufficiente creare un'istanza di un oggetto di questa classe e implementare l'interfaccia SurfaceTextureListener. La sua sintassi è data di seguito:

private TextureView myTexture;
public class MainActivity extends Activity implements SurfaceTextureListener{
   protected void onCreate(Bundle savedInstanceState) {
      myTexture = new TextureView(this);
      myTexture.setSurfaceTextureListener(this);
      setContentView(myTexture);
   }
}

Dopodiché, ciò che devi fare è sovrascrivere i suoi metodi. I metodi sono elencati come segue:

@Override
public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2) {
}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
}

@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,int arg2) {
}

@Override
public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
}

Qualsiasi vista visualizzata nella vista della trama può essere ruotata e la sua proprietà alfa può essere regolata usando setAlpha e setRotationmetodi. La sua sintassi è data di seguito:

myTexture.setAlpha(1.0f);
myTexture.setRotation(90.0f);

Oltre a questi metodi, ci sono altri metodi disponibili nella classe TextureView. Sono elencati di seguito:

Suor n Metodo e descrizione
1

getSurfaceTexture()

Questo metodo restituisce la SurfaceTexture usata da questa vista.

2

getBitmap(int width, int height)

Questo metodo restituisce Restituisce una rappresentazione bitmap del contenuto della texture di superficie associata.

3

getTransform(Matrix transform)

Questo metodo restituisce la trasformazione associata a questa visualizzazione della trama.

4

isOpaque()

Questo metodo indica se questa vista è opaca.

5

lockCanvas()

Questo metodo inizia a modificare i pixel nella superficie

6

setOpaque(boolean opaque)

Questo metodo indica se il contenuto di questa TextureView è opaco.

7

setTransform(Matrix transform)

Questo metodo imposta la trasformazione da associare a questa vista texture.

8

unlockCanvasAndPost(Canvas canvas)

Questo metodo termina la modifica dei pixel sulla superficie.

Esempio

L'esempio seguente mostra l'uso della classe TextureView. Crea un'applicazione di base che ti consente di visualizzare la telecamera all'interno di una vista texture e cambiarne l'angolo, l'orientamento ecc

Per sperimentare questo esempio, è necessario eseguirlo su un dispositivo reale su cui è presente la fotocamera.

Passi Descrizione
1 Utilizzerai l'IDE di Android Studio per creare un'applicazione Android e chiamarla TextureView in un pacchetto com.example.textureview.
2 Modifica il file src / MainActivity.java per aggiungere il codice dell'attività.
3 Modificare il file XML di layout res / layout / activity_main.xml aggiungere qualsiasi componente della GUI, se necessario.
5 Esegui l'applicazione e scegli un dispositivo Android in esecuzione, installa l'applicazione su di esso e verifica i risultati.

Ecco il contenuto di src/com.example.textureview/MainActivity.java.

package com.example.textureview;

import java.io.IOException;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.os.Bundle;

import android.view.Gravity;
import android.view.Menu;
import android.view.TextureView;
import android.view.TextureView.SurfaceTextureListener;
import android.view.View;
import android.widget.FrameLayout;

public class MainActivity extends Activity implements SurfaceTextureListener {
   private TextureView myTexture;
   private Camera mCamera;

   @SuppressLint("NewApi")
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      myTexture = new TextureView(this);
      myTexture.setSurfaceTextureListener(this);
      setContentView(myTexture);
   }
   
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }
   
   @SuppressLint("NewApi")
   @Override
   public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2) {
      mCamera = Camera.open();
      Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
      
      myTexture.setLayoutParams(new FrameLayout.LayoutParams(
      previewSize.width, previewSize.height, Gravity.CENTER));
      
      try {
         mCamera.setPreviewTexture(arg0);
      } catch (IOException t) {
      }
		
      mCamera.startPreview();
      myTexture.setAlpha(1.0f);
      myTexture.setRotation(90.0f);
   }

   @Override
   public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
      mCamera.stopPreview();
      mCamera.release();
      return true;
   }

   @Override
   public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,
   int arg2) {
      // TODO Auto-generated method stub
   }
	
   @Override
   public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
      // TODO Auto-generated method stub
   }
}

Ecco il contenuto di activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".MainActivity" >

   <TextureView
      android:id="@+id/textureView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true" />
</RelativeLayout>

Ecco il contenuto predefinito di AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.textureview" >

   <uses-permission android:name="android.permission.CAMERA"/>
   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity 
         android:name="com.example.textureview.MainActivity"
         android:label="@string/app_name" >
         
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
         
       </activity>
       
   </application>
</manifest>

Proviamo a eseguire la tua applicazione TextureView. Presumo che tu abbia collegato il tuo attuale dispositivo mobile Android al tuo computer. Per eseguire l'app da Android Studio, apri uno dei file di attività del tuo progetto e fai clic sull'icona Esegui dalla barra degli strumenti. Prima di avviare l'applicazione, Android Studio visualizzerà la seguente finestra per selezionare un'opzione in cui si desidera eseguire l'applicazione Android.

Seleziona il tuo dispositivo mobile come opzione e poi controlla il tuo dispositivo mobile che mostrerà la schermata seguente. Questa schermata ha la proprietà alfa impostata su0.5 e rotazione impostata su 45.

Questa schermata ha la proprietà alfa impostata su 1.5 e rotazione impostata su 45.

Questa schermata ha la proprietà alfa impostata su 1.0 e rotazione impostata su 90.