Android - TextureView

Si vous souhaitez afficher un flux vidéo en direct ou tout flux de contenu tel qu'une vidéo ou une scène OpenGL, vous pouvez utiliser TextureView fourni par Android pour ce faire.

Pour utiliser TextureView, tout ce que vous avez à faire est d'obtenir sa SurfaceTexture.La SurfaceTexture peut ensuite être utilisée pour rendre le contenu. Pour ce faire, il vous suffit d'instancier un objet de cette classe et d'implémenter l'interface SurfaceTextureListener. Sa syntaxe est donnée ci-dessous -

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

Après cela, ce que vous devez faire est de remplacer ses méthodes. Les méthodes sont répertoriées comme suit -

@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) {
}

Toute vue affichée dans la vue de texture peut être pivotée et sa propriété alpha peut être ajustée en utilisant setAlpha et setRotationméthodes. Sa syntaxe est donnée ci-dessous -

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

En dehors de ces méthodes, il existe d'autres méthodes disponibles dans la classe TextureView. Ils sont listés ci-dessous -

Sr.Non Méthode et description
1

getSurfaceTexture()

Cette méthode retourne la SurfaceTexture utilisée par cette vue.

2

getBitmap(int width, int height)

Cette méthode retourne Renvoie une représentation Bitmap du contenu de la texture de surface associée.

3

getTransform(Matrix transform)

Cette méthode renvoie la transformation associée à cette vue de texture.

4

isOpaque()

Cette méthode indique si cette vue est opaque.

5

lockCanvas()

Cette méthode commence à éditer les pixels de la surface

6

setOpaque(boolean opaque)

Cette méthode indique si le contenu de ce TextureView est opaque.

sept

setTransform(Matrix transform)

Cette méthode définit la transformation à associer à cette vue de texture.

8

unlockCanvasAndPost(Canvas canvas)

Cette méthode termine l'édition des pixels de la surface.

Exemple

L'exemple ci-dessous illustre l'utilisation de la classe TextureView. Il crée une application de base qui vous permet de voir la caméra à l'intérieur d'une vue de texture et de changer son angle, son orientation, etc.

Pour expérimenter cet exemple, vous devez l'exécuter sur un appareil réel sur lequel la caméra est présente.

Pas La description
1 Vous utiliserez l'IDE de studio Android pour créer une application Android et la nommerez TextureView sous un package com.example.textureview.
2 Modifiez le fichier src / MainActivity.java pour ajouter le code d'activité.
3 Modifiez le fichier XML de mise en page res / layout / activity_main.xml, ajoutez un composant GUI si nécessaire.
5 Exécutez l'application et choisissez un appareil Android en cours d'exécution, installez l'application dessus et vérifiez les résultats.

Voici le contenu de 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
   }
}

Voici le contenu de 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>

Voici le contenu par défaut de 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>

Essayons d'exécuter votre application TextureView. Je suppose que vous avez connecté votre appareil mobile Android à votre ordinateur. Pour exécuter l'application à partir du studio Android, ouvrez l'un des fichiers d'activité de votre projet et cliquez sur l' icône Exécuter dans la barre d'outils. Avant de démarrer votre application, Android studio affichera la fenêtre suivante pour sélectionner une option dans laquelle vous souhaitez exécuter votre application Android.

Sélectionnez votre appareil mobile en option, puis vérifiez votre appareil mobile qui affichera l'écran suivant. Cet écran a la propriété alpha définie sur0.5 et rotation réglée sur 45.

Cet écran a la propriété alpha définie sur 1.5 et rotation réglée sur 45.

Cet écran a la propriété alpha définie sur 1.0 et rotation réglée sur 90.