Android VideoView 视频播放器 仿抖音
前言
最近项目有个需求 , 做个类似抖音的视频效果. 又因为包大小的问题不使用第三方SDK,所以使用原生的VideoView开发了一下, 搭配RecyclerView和PageSnapHelper来实现抖音的效果.
全部代码: github
看一下实现流程:
首先创建了一个继承自ConstraintLayout的View,用来实现自己的布局.东西不多, 里面主要是播放控制的按钮, 和一个可以拖动的进度条.在视频加载成功之前显示一个封面图.
然后创建了一个State的enum类:
public enum VideoState {unKnow,loadFinish,playing,playEnd,error,pause}
这是主要是用于在视频进度有变化的时候用来保存一下状态 .
之后创建了一个handler , 用于实时更新进度条,以及已播放的时间.
@SuppressLint("HandlerLeak")private final Handler mHandler = new Handler() {@SuppressLint("SetTextI18n")@Overridepublic void handleMessage(Message msg) {if (msg.what == UPDATE_PROGRESS) {if (videoView.isPlaying()) {int currentTime = videoView.getCurrentPosition();if (currentTime >= mDuration) {videoView.seekTo(0);seekBarProgress.setProgress(0);alreadyTextView.setText("00:00");mHandler.removeMessages(UPDATE_PROGRESS);} else {seekBarProgress.setProgress(currentTime);mHandler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 500);alreadyTextView.setText(TimeUtil.formatTimeWhichExist(currentTime));}}}}};
然后实现一个SeekBar 的监听 ,
3个函数分别是:
- OnSeekBarChangeListener: 进度条有改变
- onStartTrackingTouch 手指按下进度条
- onStopTrackingTouch 手指离开进度条
private SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {alreadyTextView.setText(TimeUtil.formatTimeWhichExist(progress));if (mOnProgressChangedListener != null) {mOnProgressChangedListener.onProgressChanged(progress);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// 暂停刷新mHandler.removeMessages(UPDATE_PROGRESS);}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {int progress = seekBar.getProgress();if (videoView != null) {if (progress + 1000 < mDuration) {// 设置当前播放的位置videoView.seekTo(progress);mHandler.sendEmptyMessage(UPDATE_PROGRESS);} else {mVideoState = VideoState.playEnd;start();}}}};
在按下的时候 , 停止跟随视频进度改变, 离开时 , 从当前位置继续播放.
但是视频是有关键帧的, 所以可能会跳到前一个关键帧的位置播放.
在进度有改变的时候, 实时改变已播放的时间的textview.
在播放器初始化的时候, 监听一下视频播放.
- setOnPreparedListener 是去加载视频 , 有一个加载完成时的回调, 这里在加载完成时, 隐藏封面并开始播放.
- setOnCompletionListener 是播放完成时的回调,此时改变进度并重新播放视频.
- setOnErrorListener 是视频播放出错的回调
videoView.setOnPreparedListener(mp -> {mVideoState = VideoState.loadFinish;mHandler.sendEmptyMessage(UPDATE_PROGRESS);totalPlayTextView.setText(Util.formatTimeWhichExist(mDuration));videoThumb.setVisibility(GONE);start();});videoView.setOnCompletionListener(mp -> {mHandler.removeMessages(UPDATE_PROGRESS);mVideoState = VideoState.playEnd;changePlayIcon();seekBarProgress.setProgress(0);alreadyTextView.setText("00:00");videoThumb.setVisibility(VISIBLE);});videoView.setOnErrorListener((mp, what, extra) -> {//异常回调mVideoState = VideoState.error;return false;});
之后定义了一些操控视频的方法 , 像播放,暂停,获取播放进度等等的public方法, 用来给外界调用.
public void start() {if (mVideoState == VideoState.playEnd) {videoView.resume();} else {videoView.start();}mVideoState = VideoState.playing;changePlayIcon();mHandler.sendEmptyMessage(UPDATE_PROGRESS);}public void pause() {videoView.pause();mVideoState = VideoState.pause;changePlayIcon();}public void stop() {videoView.stopPlayback();mHandler.removeMessages(UPDATE_PROGRESS);}public void setVideoVisible() {controllerLayout.setVisibility(VISIBLE);}public void setVideoGone() {controllerLayout.setVisibility(GONE);}public VideoState getState() {if (videoView.isPlaying()) {mVideoState = VideoState.playing;}return mVideoState;}public int getCurrentPosition() {return videoView.getCurrentPosition();}
设置视频数据:
public void setVideo(VideoInfo video) {try {videoView.setVideoURI(Uri.parse(video.getUrl()));mDuration = (int) video.getDuration();seekBarProgress.setMax(mDuration);start();//宽高比int width = video.getWidth();int height = video.getHeight();float aspectRatio = (float) width / height;ConstraintLayout.LayoutParams layoutParamsThumb = (ConstraintLayout.LayoutParams) videoThumb.getLayoutParams(); //取控件textView当前的布局参数setLayoutParam(layoutParamsThumb, aspectRatio);videoThumb.setLayoutParams(layoutParamsThumb);} catch (Throwable ignore) {}}
这里是播放的网络视频, 所以传进来的是一个url , 并且根据宽高比显示封面图 , 使其和视频的位置和大小是一致的.
其他代码应该都不需要介绍了, 详细了解可以看看github
Android VideoView 视频播放器 仿抖音相关推荐
- Android 利用ConstraintLayout 实现仿抖音点赞动画效果
正好在做一个和抖音差不多的APP,目前在刚启动阶段,先从实现一个抖音的点赞动画开始...爱心是从阿里的矢量图标库下载的一个爱心的Png图片,不是使用贝塞尔曲线画的...原因是我不会贝塞尔曲线(其实就是 ...
- 封装bilibili播放器 , 仿抖音视频播放效果
作者:Zhaoss 链接: https://www.jianshu.com/p/264324559c07 1概述 项目地址: https://github.com/Zhaoss/VideoPlayer ...
- 推荐两个高仿抖音 GitHub 开源项目( iOS 和 Android)
人工智能(Artificial Intelligence),英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学. 抖音短视频 App 火速爆红,没 ...
- Android短视频播放器组件库GSYVideoPlayer和仿抖音切换DKVideoPlayer可以悬浮框及滑动小屏播放
原文地址:https://blog.csdn.net/u011287484/article/details/105202121/ 实现安卓上的短视频播放器功能,有两个好用的组件库GSYVideoPla ...
- Android仿抖音我的页面,Android自定义videoview仿抖音界面
本文实例为大家分享了Android自定义videoview仿抖音界面的具体代码,供大家参考,具体内容如下 1.效果图 和抖音的界面效果一模一样,而且可以自定义,需要什么页面,请自己定义 2.自定义vi ...
- Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放
1. 实现效果 效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频 ...
- Android仿抖音主页效果实现
目录 写在前面 一.准备工作 1.1.主页面布局 1.2.列表Item布局 1.3.列表Item适配器 二.自定义LayoutManager 三.实现播放 补充:源码地址:https://github ...
- 基于android的高仿抖音,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
- Android 仿抖音视频播放列表和评论列表
Android 汇集CSDN.GitHub等最实用的良心之作-KING Android最实用的各种技能点的网址链接(每天都会更新,希望大家用的上) Android 仿抖音系列之视频播放列表和评论列表 ...
最新文章
- bat文件注册为Windows服务与依赖关系设置
- 库的标准实现和私有实现的选择
- Ajax Toolkit 控件学习系列(5) ——CalendarExtender使用
- maven 本地包依赖包打进jar
- Dex Loader] Failed to load D:\adt-bundle-windows-x86_64-20190307\sdk\build-tools\28.0.3\lib\dx.jar
- 关于luarocks
- Self-paced and auto-weighted multi-view clustering 阅读笔记
- 专升本高数——第八章 多元函数积分学【学习笔记】
- 20201212大一集训牛客网题之d题中学数学题
- 树莓派声音输出设置_Raspberry Pi(树莓派)声音输出的设置
- Android 动画基础知识学习(下)
- 沉溺于成为资深Java程序员的危机
- 关于右键自定义 vue-contextmenu
- DSCP(Differentiated Service Codepoint,差分服务代码点)
- order by 空值排在最后_ZSBL高中组晋级赛圆满结束!汤溪中学杀出重围,顺利夺下最后一张总决赛门票!...
- 腾讯ISUX:精益设计 “纸上谈兵”的说服力
- Matlab实现 乘幂法反幂法
- 通俗易懂的基金理财(小白)
- 只有偏执狂才能生存!
- SIMCOM手册AT指令
热门文章
- XTU OJ 1381表格
- java汉字转换国标码_GBK/GB2312编码问题分析以及java获取汉字国标码
- 用arjs和aframe打造太阳系-第二章
- 从Spy Mouse看App Store的推广方法
- SDUT 4123 喵帕斯之天才算数少女
- javamail发送/回复邮件报错: Local address contains control or whitespace in string
- 移动通信的语音与数据漫游
- vista下安装仿宋GB_2312和楷体_GB2312 office2007字体问题
- 哪些飞机机型是安全、可信赖的
- AJAX使用淘宝API查询手机归属地和运营商信息