Android - TextureView
Se você deseja exibir um fluxo de vídeo ao vivo ou qualquer fluxo de conteúdo, como vídeo ou uma cena OpenGL, pode usar o TextureView fornecido pelo Android para fazer isso.
Para usar TextureView, tudo que você precisa fazer é obter sua SurfaceTexture. A SurfaceTexture pode então ser usada para renderizar conteúdo. Para fazer isso, você só precisa instanciar um objeto desta classe e implementar a interface SurfaceTextureListener. Sua sintaxe é fornecida abaixo -
private TextureView myTexture;
public class MainActivity extends Activity implements SurfaceTextureListener{
protected void onCreate(Bundle savedInstanceState) {
myTexture = new TextureView(this);
myTexture.setSurfaceTextureListener(this);
setContentView(myTexture);
}
}
Depois disso, o que você precisa fazer é substituir seus métodos. Os métodos são listados a seguir -
@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) {
}
Qualquer visão que é exibida na visão de textura pode ser girada e sua propriedade alfa pode ser ajustada usando setAlpha e setRotationmétodos. Sua sintaxe é fornecida abaixo -
myTexture.setAlpha(1.0f);
myTexture.setRotation(90.0f);
Além desses métodos, existem outros métodos disponíveis na classe TextureView. Eles estão listados abaixo -
Sr. Não | Método e descrição |
---|---|
1 |
getSurfaceTexture() Este método retorna a SurfaceTexture usada por esta vista. |
2 |
getBitmap(int width, int height) Este método retorna Retorna uma representação em bitmap do conteúdo da textura da superfície associada. |
3 |
getTransform(Matrix transform) Este método retorna a transformação associada a esta visualização de textura. |
4 |
isOpaque() Este método indica se esta View é opaca. |
5 |
lockCanvas() Este método começa a editar os pixels na superfície |
6 |
setOpaque(boolean opaque) Este método indica se o conteúdo deste TextureView é opaco. |
7 |
setTransform(Matrix transform) Este método define a transformação para associar a esta visualização de textura. |
8 |
unlockCanvasAndPost(Canvas canvas) Este método finaliza a edição de pixels na superfície. |
Exemplo
O exemplo a seguir demonstra o uso da classe TextureView. Ele cria um aplicativo básico que permite visualizar a câmera dentro de uma visualização de textura e alterar seu ângulo, orientação, etc.
Para experimentar este exemplo, você precisa executá-lo em um dispositivo real no qual a câmera esteja presente.
Passos | Descrição |
---|---|
1 | Você usará o Android Studio IDE para criar um aplicativo Android e nomeá-lo como TextureView em um pacote com.example.textureview. |
2 | Modifique o arquivo src / MainActivity.java para adicionar o código de atividade. |
3 | Modifique o arquivo XML de layout res / layout / activity_main.xml e adicione qualquer componente GUI, se necessário. |
5 | Execute o aplicativo e escolha um dispositivo Android em execução, instale o aplicativo nele e verifique os resultados. |
Aqui está o conteúdo 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
}
}
Aqui está o conteúdo 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>
Aqui está o conteúdo padrão 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>
Vamos tentar executar seu aplicativo TextureView. Presumo que você tenha conectado o seu dispositivo Android Mobile real ao computador. Para executar o aplicativo do Android Studio, abra um dos arquivos de atividade do seu projeto e clique no ícone Executar na barra de ferramentas. Antes de iniciar seu aplicativo, o Android Studio exibirá a janela a seguir para selecionar uma opção onde você deseja executar seu aplicativo Android.
Selecione seu dispositivo móvel como uma opção e, em seguida, verifique seu dispositivo móvel, que exibirá a tela a seguir. Esta tela tem a propriedade alfa definida para0.5 e rotação definida para 45.
Esta tela tem a propriedade alfa definida para 1.5 e rotação definida para 45.
Esta tela tem a propriedade alfa definida para 1.0 e rotação definida para 90.