TextureView 란?
TextureView는 4.0 (API 레벨 14)에서 도입되었으며 SurfaceView와 비교하여 콘텐츠를 표시하는 새 창을 생성하지 않습니다. 콘텐츠 스트림을 뷰에 직접 배치하고 다른 일반 뷰처럼 이동, 회전, 확대 / 축소 및 애니메이션 효과를 줄 수 있습니다. TextureView는 하드웨어 가속 창에서 사용해야합니다. 오늘날의 모바일 장치에는 기본적으로 하드웨어 가속 렌더링을위한 GPU가 있습니다.
SurfaceTexture
이 기사에서 우리는 이미 Surface가 메모리의 드로잉 버퍼라는 것을 알고
있는데 SurfaceTexture는 무엇일까요?
SurfaceTexture는 비디오 스트림에서 이미지 프레임을 캡처하는 데 사용됩니다. 비디오 스트림은 카메라 미리보기 또는 비디오 디코딩 데이터 일 수 있습니다.
TextureView는 getSurfaceTexture () 메서드를 통해 TextureView의 해당 SurfaceTexture를 가져올 수 있습니다.
따라서 TextureView를 사용할 때 먼저 콘텐츠를 렌더링하는 데 사용되는 SurfaceTexture를 가져와야합니다. 구체적인 방법은 먼저 TextureView 객체를 만든 다음 SurfaceTextureListener 인터페이스를 구현하는 것입니다.
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.main_layout);
myTexture = new TextureView(this);
myTexture.setSurfaceTextureListener(this);
}
활동은 SurfaceTextureListener 인터페이스를 구현하므로 활동에서 다음 메서드를 다시 작성해야합니다.
@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) {
}
이행:
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.view.Surface;
import android.view.TextureView;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, MediaPlayer.OnPreparedListener{
private TextureView textureView;
private Surface mSurface;
private String URL = "/sdcard/Video/MV.mp4";
private MediaPlayer mediaPlayer;
private final static int REQUEST_CODE = 1234;
private final static String[] permissions = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) {
requestPermission();
}
setContentView(R.layout.activity_main);
mediaPlayer = new MediaPlayer();
textureView = findViewById(R.id.textureview);
textureView.setSurfaceTextureListener(this);
}
public void play() {
try {
mediaPlayer.reset();//重置
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(URL);
mediaPlayer.setSurface(mSurface);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(this);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mSurface = new Surface(surface);
play();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
surface = null;
mSurface = null;
mediaPlayer.stop();
mSurface.release();
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
@Override
protected void onPause() {
super.onPause();
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//释放资源
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
private void requestPermission() {
requestPermission(permissions);
}
protected void requestPermission(String[] permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissions, REQUEST_CODE);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextureView
android:id="@+id/textureview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>