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的问题。
网友评论