一、什麼是TextureView
TextureView是Android 4.0(API level 14)引入的一個新的控制項,它可以在UI線程之外維護一個可渲染的surface,這允許我們可以將播放視頻這樣複雜的任務放到子線程中去執行,從而提高程序的性能。相較於SurfaceView,在TextureView中我們可以使用TextureView.setTransform()方法來對視頻進行旋轉、移動等的變換操作。但是使用TextureView也有一些限制,比如只有在硬體加速開啟的情況下才有效,並且在TextureView上不能覆蓋其他View。
二、使用TextureView播放視頻
我們還需要使用MediaPlayer來進行視頻的播放。在UI布局文件中,我們可以如下聲明TextureView和一個Button控制項:
<TextureView
android:id="@+id/textureView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/startBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="開始播放" />
在Java代碼中,我們可以通過如下代碼來初始化MediaPlayer和TextureView:
private MediaPlayer mediaPlayer;
private TextureView textureView;
private Button startBtn;
private void initView() {
textureView = findViewById(R.id.textureView);
startBtn = findViewById(R.id.startBtn);
// 初始化MediaPlayer並設置監聽器
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start(); // 開始播放視頻
}
});
// 設置TextureView的監聽器
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mediaPlayer.setSurface(new Surface(surface));
try {
mediaPlayer.setDataSource("video.mp4"); // 視頻文件的路徑
mediaPlayer.prepareAsync(); // 非同步載入視頻
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
mediaPlayer.stop(); // 銷毀TextureView時停止播放視頻
mediaPlayer.release();
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
});
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.start(); // 點擊按鈕開始播放
}
});
}
三、將TextureView與RecyclerView聯動
在某些場景下,我們需要將TextureView與RecyclerView聯動,實現類似於社交軟體中的視頻滾動瀏覽效果。
在我們的RecyclerView的Adapter中,需要為每個TextureView設置一個SurfaceTextureListener。在onBindViewHolder()方法中,我們可以創建一個新的MediaPlayer,為它設置數據源和回調監聽,以及為TextureView設置SurfaceTextureListener。在onViewRecycled()方法中,我們需要釋放MediaPlayer所佔用的資源。
public class VideoAdapter extends RecyclerView.Adapter<VideoViewHolder> {
private List<String> videoList;
private MediaPlayer mediaPlayer;
private TextureView.SurfaceTextureListener surfaceTextureListener;
public VideoAdapter(List<String> videoList) {
this.videoList = videoList;
mediaPlayer = new MediaPlayer();
surfaceTextureListener = createSurfaceTextureListener();
}
@NonNull
@Override
public VideoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 創建ViewHolder
}
@Override
public void onBindViewHolder(@NonNull VideoViewHolder holder, int position) {
TextureView textureView = holder.getTextureView();
textureView.setSurfaceTextureListener(surfaceTextureListener);
String videoUrl = videoList.get(position);
try {
mediaPlayer.setDataSource(videoUrl);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onViewRecycled(@NonNull VideoViewHolder holder) {
TextureView textureView = holder.getTextureView();
mediaPlayer.stop();
mediaPlayer.reset();
textureView.setSurfaceTextureListener(null);
}
@Override
public int getItemCount() {
return videoList.size();
}
private TextureView.SurfaceTextureListener createSurfaceTextureListener() {
return new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mediaPlayer.setSurface(new Surface(surface));
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
};
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/293075.html
微信掃一掃
支付寶掃一掃