前言

最近项目有个需求 , 做个类似抖音的视频效果. 又因为包大小的问题不使用第三方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 视频播放器 仿抖音相关推荐

  1. Android 利用ConstraintLayout 实现仿抖音点赞动画效果

    正好在做一个和抖音差不多的APP,目前在刚启动阶段,先从实现一个抖音的点赞动画开始...爱心是从阿里的矢量图标库下载的一个爱心的Png图片,不是使用贝塞尔曲线画的...原因是我不会贝塞尔曲线(其实就是 ...

  2. 封装bilibili播放器 , 仿抖音视频播放效果

    作者:Zhaoss 链接: https://www.jianshu.com/p/264324559c07 1概述 项目地址: https://github.com/Zhaoss/VideoPlayer ...

  3. 推荐两个高仿抖音 GitHub 开源项目( iOS 和 Android)

    人工智能(Artificial Intelligence),英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学. 抖音短视频 App 火速爆红,没 ...

  4. Android短视频播放器组件库GSYVideoPlayer和仿抖音切换DKVideoPlayer可以悬浮框及滑动小屏播放

    原文地址:https://blog.csdn.net/u011287484/article/details/105202121/ 实现安卓上的短视频播放器功能,有两个好用的组件库GSYVideoPla ...

  5. Android仿抖音我的页面,Android自定义videoview仿抖音界面

    本文实例为大家分享了Android自定义videoview仿抖音界面的具体代码,供大家参考,具体内容如下 1.效果图 和抖音的界面效果一模一样,而且可以自定义,需要什么页面,请自己定义 2.自定义vi ...

  6. Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

    1. 实现效果 效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频 ...

  7. Android仿抖音主页效果实现

    目录 写在前面 一.准备工作 1.1.主页面布局 1.2.列表Item布局 1.3.列表Item适配器 二.自定义LayoutManager 三.实现播放 补充:源码地址:https://github ...

  8. 基于android的高仿抖音,Android仿抖音列表效果

    本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...

  9. Android 仿抖音视频播放列表和评论列表

    Android 汇集CSDN.GitHub等最实用的良心之作-KING Android最实用的各种技能点的网址链接(每天都会更新,希望大家用的上) Android 仿抖音系列之视频播放列表和评论列表 ...

最新文章

  1. bat文件注册为Windows服务与依赖关系设置
  2. 库的标准实现和私有实现的选择
  3. Ajax Toolkit 控件学习系列(5) ——CalendarExtender使用
  4. maven 本地包依赖包打进jar
  5. Dex Loader] Failed to load D:\adt-bundle-windows-x86_64-20190307\sdk\build-tools\28.0.3\lib\dx.jar
  6. 关于luarocks
  7. Self-paced and auto-weighted multi-view clustering 阅读笔记
  8. 专升本高数——第八章 多元函数积分学【学习笔记】
  9. 20201212大一集训牛客网题之d题中学数学题
  10. 树莓派声音输出设置_Raspberry Pi(树莓派)声音输出的设置
  11. Android 动画基础知识学习(下)
  12. 沉溺于成为资深Java程序员的危机
  13. 关于右键自定义 vue-contextmenu
  14. DSCP(Differentiated Service Codepoint,差分服务代码点)
  15. order by 空值排在最后_ZSBL高中组晋级赛圆满结束!汤溪中学杀出重围,顺利夺下最后一张总决赛门票!...
  16. 腾讯ISUX:精益设计 “纸上谈兵”的说服力
  17. Matlab实现 乘幂法反幂法
  18. 通俗易懂的基金理财(小白)
  19. 只有偏执狂才能生存!
  20. SIMCOM手册AT指令

热门文章

  1. XTU OJ 1381表格
  2. java汉字转换国标码_GBK/GB2312编码问题分析以及java获取汉字国标码
  3. 用arjs和aframe打造太阳系-第二章
  4. 从Spy Mouse看App Store的推广方法
  5. SDUT 4123 喵帕斯之天才算数少女
  6. javamail发送/回复邮件报错: Local address contains control or whitespace in string
  7. 移动通信的语音与数据漫游
  8. vista下安装仿宋GB_2312和楷体_GB2312 office2007字体问题
  9. 哪些飞机机型是安全、可信赖的
  10. AJAX使用淘宝API查询手机归属地和运营商信息