VideoView
介绍:继承于SurfaceView,主要用来播放加载视频
特点:
集成度高,开发难度小,只是灵活性差。
注意:默认的videoView不能全屏播放,要全屏需要自定义重写
onMeasure()方法,将多余的空间释放出来,如下:
protected void
onMeasure
(
int
widthMeasureSpec
,
int
heightMeasureSpec
) {
int
widthSize=
MeasureSpec
.
getSize
(
widthMeasureSpec
);
int
heightSize=
MeasureSpec
.
getSize
(
heightMeasureSpec
);
setMeasuredDimension
(widthSize,heightSize);
主要方法介绍:
- setVidePath(String path):加载path文件代表的视频
-
- setVideoURI(Uri uri):加载uri所对应的视频
-
- setMediaController(MediaController controller):加载一个MediaController ,自带暂停、播放、快进、快退按钮以及进度条和时间。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置横屏
setRequestedOrientation(
ActivityInfo
.
SCREEN_ORIENTATION_PORTRAIT
);
//设置竖屏
//播放本地raw资源
vv.setVideoURI(Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.splash_1));
注意:需要新建一个raw文件夹并把所需的资源放入
//播放sd卡里的视频文件
.setVidoURI(Uri.fromFile(new File("文件路径")))
注意:获取sd卡里的文件时需要读取权限
监听事件:
//视频播放完成时的回调
vv
.setOnCompletionListener(
new
MediaPlayer.OnCompletionListener
() {
@Override
public void
onCompletion
(
MediaPlayer
mp
) {
vv
.start();
//实现循环播放
}
});
//播放视频时出错的回调
vv
.setOnErrorListener(
new
MediaPlayer.OnErrorListener
() {
@Override
public boolean
onError
(
MediaPlayer
mp
,
int
what
,
int
extra
) {
return false
;
}
});
//播放视频前的回调
vv
.setOnPreparedListener(
new
MediaPlayer.OnPreparedListener
() {
@Override
public void
onPrepared
(
MediaPlayer
mp
) {
int
duration=
mp
.getDuration();
//时长
int
currentPosition=
mp
.getCurrentPosition();
//播放的位置
}
});
使用步骤:
1、在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件
2、调用VideoView的如下两个方法来加载指定的视频
- setVideoURI(Uri uri)
- setMediaController(MediaController controller)
3、调用VideoView的start()播放
4、设置videoView的监听事件
SurfaceView
**
* Surfaceview特性:
* 1.可以在子线程绘制界面
* 2.只在surfaceCreated方法被调用后才可以进行绘制,surfaceDestroyed前结束绘制
*
* Surfaceview的使用:
1.在布局文件中定义Surface组件和相关控件(例如进度条Seekbar)并设置id,在代码中声明绑定
2.通过
继承
SurfaceHolder.Callback
,并重写
surfaceCreated(),surfaceDestroyed,surfaceChanged()
获得holder控制器来控制SurfaceView
注意:最主要的是前两个方法
3.
获取SurfaceHolder对象 ,Surface对象.getHolder()
4.
注册SurfaceView的生命周期方法
SurfaceHolder对象
.addCallback(
this
);
5.新建MediaPlayer对象,并设置点击事件
setOnPreparedListener()视频播放前的相关操作:
mediaPlayer
.start();
// 开始播放视频
long
duration =
mp
.getDuration();
// 单位:毫秒
long
currentPosition =
mp
.getCurrentPosition();
seekBar
.setMax((
int
) duration);
// 初始化seekbar
seekBar
.setProgress((
int
) currentPosition);
tvDuration
.setText((
int
) (duration /
1000
) +
""
);
// 要求显示秒
tvCurrentT
.setText((
int
) (currentPosition /
1000
) +
""
);
// 要求显示秒
updateView();
// 启动视频界面更新的业务
6.在
surfaceCreated(),将mediaPlayer对象和SufaceHolder进行关联操作
mediaPlayer
.setDisplay(
surfaceHolder
);
// 将视频控制器和界面显示控制器进行绑定
mediaPlayer
.setDataSource(
Context context
,
Uri uri
);//uri为视频资源链接
mediaPlayer
.prepareAsync();
// 准备进行异步播放视频
7.在sufaceDestroyed()方法里,进行mediaPlayer的停止和销毁.
mediaPlayer
.stop();
// 停止播放视频
mediaPlayer
.release();
// 对视频资源进行释放
*
*/