TextureView在4.0(API level 14)中引入。它可以將內容流直接投影到View中,可以用于實現Live preview等功能。和SurfaceView不同,它不會在WMS中單獨創建窗口,而是作為View hierachy中的一個普通View,因此可以和其它普通View一樣進行移動,旋轉,縮放,動畫等變化。值得注意的是TextureView必須在硬件加速的窗口中。它顯示的內容流數據可以來自App進程或是遠端進程。下面是一個用TextureView進行視頻播放的例子,非常簡單。
1, 設置監聽
textureView.setSurfaceTextureListener(this);
2,實現監聽方法
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
this.surface = new Surface(surface);
if (new File(mFilePath).exists()) {
play(mFilePath); //播放視頻
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
surface = null;
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
主要就實現了連個方法,一個用于播放,一個用于釋放資源。
3,實現播放方法
public void play(String filePath) {
try {
File file = new File(filePath);
if (!file.exists()) {//文件不存在
Toast.makeText(getActivity(), "文件路徑錯誤", Toast.LENGTH_SHORT).show();
}
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(file.getAbsolutePath());
mMediaPlayer.setSurface(surface);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
}
});
mMediaPlayer.prepare();
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
delayHandler.postDelayed(new Runnable() {
@Override
public void run() {
removeSelf();
}
}, 1000);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
相當簡單,而且沒有使用SurfaceView和VideoView可能會出現的 QCMediaPlayer mediaplayer NOT present的問題。