Android上定义播放器控件UniversalVideoView

原创
2015/10/26 18:54
阅读数 5W

在Android上播放视频最简单的方法是使用SDK中内置的VideoView,然后加上MediaController来控制视频播放暂停等,但是这样有一个缺点是无法定制自己的控制UI,所以这里提供一个自定义播放控件,它可以设置多种自定义属性(如loading样式,错误视频等),并且很容易在全屏与非全屏之间切换,另外支持Android V2.3及以上系统.


项目地址: https://github.com/linsea/UniversalVideoView


使用方法

完整的使用方法请参考项目里的Sample.


1. 在build.gradle文件上加入以下依赖包.

dependencies {
      compile 'com.linsea:universalvideoview:1.1.0@aar'
 }

2. 在布局文件中加入自定义View,注意要使UniversalVideoView和UniversalMediaController位于同一个父Layout中, 这样控制条才会浮在视频之上.



            <FrameLayout
                android:id="@+id/video_layout"
                android:layout_width="fill_parent"
                android:layout_height="200dp"
                android:background="@android:color/black">

                <com.universalvideoview.UniversalVideoView
                    android:id="@+id/videoView"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_gravity="center"
                    app:uvv_autoRotation="true"
                    app:uvv_fitXY="false" />

                <com.universalvideoview.UniversalMediaController
                    android:id="@+id/media_controller"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    app:uvv_scalable="true" />

            </FrameLayout>


3. 在onCreate方法中设置相关事件的监听.

View mBottomLayout;
View mVideoLayout;
UniversalVideoView mVideoView;
UniversalMediaController mMediaController;

mVideoView = (UniversalVideoView) findViewById(R.id.videoView);
mMediaController = (UniversalMediaController) findViewById(R.id.media_controller);
mVideoView.setMediaController(mMediaController);

mVideoView.setVideoViewCallback(new UniversalVideoView.VideoViewCallback() {
    @Override
    public void onScaleChange(boolean isFullscreen) {
        this.isFullscreen = isFullscreen;
        if (isFullscreen) {
            ViewGroup.LayoutParams layoutParams = mVideoLayout.getLayoutParams();
            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
            layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
            mVideoLayout.setLayoutParams(layoutParams);
            //设置全屏时,无关的View消失,以便为视频控件和控制器控件留出最大化的位置
            mBottomLayout.setVisibility(View.GONE);
        } else {
            ViewGroup.LayoutParams layoutParams = mVideoLayout.getLayoutParams();
            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
            layoutParams.height = this.cachedHeight;
            mVideoLayout.setLayoutParams(layoutParams);
            mBottomLayout.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onPause(MediaPlayer mediaPlayer) { // 视频暂停
        Log.d(TAG, "onPause UniversalVideoView callback");
    }

    @Override
    public void onStart(MediaPlayer mediaPlayer) { // 视频开始播放或恢复播放
        Log.d(TAG, "onStart UniversalVideoView callback");
    }

    @Override
    public void onBufferingStart(MediaPlayer mediaPlayer) {// 视频开始缓冲
        Log.d(TAG, "onBufferingStart UniversalVideoView callback");
    }

    @Override
    public void onBufferingEnd(MediaPlayer mediaPlayer) {// 视频结束缓冲
        Log.d(TAG, "onBufferingEnd UniversalVideoView callback");
    }

});

注意:
UniversalVideoView 没有保存播放的状态,如播放到第几分钟了,所以需要应用自己保存这些状态并恢复.
如果为了避免在旋转屏幕时系统重启Activity,需要添加Activity的属性:
android:configChanges="orientation|keyboardHidden|screenSize

4 定制属性

为了保证定制UI的灵活度,提供以下属性:

uvv_fitXY

UniversalVideoView的属性,布尔值,true时设置视频缩放时在X,Y方向上铺满View设置的宽度和高度,这样可能使视频变形.false时则缩放时保持视频的长宽比例,与SDK中的VideoView类似.


uvv_autoRotation

UniversalVideoView的属性,布尔值,true时视频会根据重力响应通知客户进行全屏与非全屏之间的切换.

uvv_scalable

UniversalMediaController属性,布尔值,是否显示控制条右下方的缩放按钮,如果不想全屏播放时,可以设置为false不显示.




展开阅读全文
打赏
4
28 收藏
分享
加载中
急急急 这是个 bug吗??
2017/10/28 22:44
回复
举报
Android 5.0系统 播放视频失败 有声音但是没有图像 出现一个加载错误
2017/10/28 22:44
回复
举报
当两个SurfaceView (重叠一大一小) 时setZOrderOnTop(true);UniversalMediaController不可见 可参考原生VideoView
2017/04/13 15:05
回复
举报
linsea博主
该评论暂时无法显示,详情咨询 QQ 群:912889742
该评论暂时无法显示,详情咨询 QQ 群:912889742
大神,为什么视频的预加载在锤子坚果和华为p8上不兼容,网络好只加载一次,然后播放到加载处就报错?如何自己控制多次预加载或者一次加载完??急急急!
2016/09/05 21:38
回复
举报
大神,为什么代码的预加载在锤子坚果和华为p8上不兼容,网络好只加载一次,然后播放到加载处就报错?如何自己控制多次预加载或者一次加载完??急急急!
2016/09/05 21:35
回复
举报
先赞一下,真不错。。。其次请问我如何设置让他一进来就可以全屏播放呢?急急急...
2016/08/18 20:06
回复
举报
您好,我使用的时候视频不是全屏而是聚在左上角,我想让它全屏显示,这要怎么解决?
2016/08/17 17:11
回复
举报
linsea博主

引用来自“maoqitian”的评论

博主,我使用你的这个框架进行视频连续播放,但是播放到第二段或者第三段切换全屏则继续从第一个视频开始播放,请问有什么好的解决办法让他定位而到播放的视频而不是重新播放第一段么?

你可能需要自己维护播放的状态,请参考Demo
2016/08/14 19:38
回复
举报
更多评论
打赏
122 评论
28 收藏
4
分享
返回顶部
顶部