本文介绍一个简单的视频播放器的实现,主要功能是读取U盘视频文件,通过UI显示进行播放,包括UI的一些控制逻辑,由于以demo的形式实现,因此UI设计效果比较一般,主要实现对应的功能,下面就简单介绍下整体的实现过程。

1:进入主页,点击获取并播放视频,进行视频资源的获取和播放,首先视频资源的获取实现如下:

  /*** 获取搜索到的结果*/public void getVideoList() {ExecutorsThreadManager.getInstance().submitThread(new Runnable() {@Overridepublic void run() {List<String> list = new ArrayList<>();File file = new File(PATH_USB_SRC);
//                Log.d("daxiang",file.getName());if (file.exists()) {File[] files = file.listFiles();if (files != null && files.length != 0) {for (int i = 0; i < files.length; i++) {File result = files[i];Log.d("daxiang", result.getName());if (!result.isDirectory() && result.getName().endsWith(VIDEO_NAME)) {String videoPath = PATH_USB_SRC +"/"+result.getName();list.add(videoPath);}}Message msg = mFileHandler.obtainMessage();msg.obj = list;mFileHandler.sendMessage(msg);}}}});}

通过轮询u盘根目录,查找根目录下包括对应视频类型文件放入List集合中,并将数据返回给到Activity。

2:UI的实现是通过ViewPager2加载RecyclerView.Adapter实现,具体的实现方式是:

UI的加载:
mGxAdapter = new GxAdapter(result);
mGxAdapter.setGxAdapterListener(this);
binding.viewpage2.setAdapter(mGxAdapter);
binding.viewpage2.registerOnPageChangeCallback(new GxPageChangeCallback(this));
数据在adapter的刷新展示:private void listenLiveData() {videoData.observe(this, new Observer() {@Overridepublic void onChanged(Object o) {result = (List<String>) o;for (int i = 0; i < result.size(); i++) {Log.d(TAG, "result==>" + result.get(i));}if (mGxAdapter != null) {mGxAdapter.notifyAdapter(result);}}});}其中GxAdapterListener:
/*** 设置SurfaceView的点击监听** @param l 监听对象*/public void setGxAdapterListener(GxAdapterListener l) {mGxAdapterListener = l;}

3:ViewPager2的下拉刷新策略:

首先在xml中设置ViewPager2的下拉方向为垂直,

android:orientation="vertical"

然后ViewPager2监听页面改变事件

binding.viewpage2.registerOnPageChangeCallback(new GxPageChangeCallback(this));

在onPageScrollStateChanged时候将对应的位置返回给到Activity进行ui的刷新,如下:

 @Overridepublic void onPageScrollStateChanged(int state) {super.onPageScrollStateChanged(state);Log.d("daxiang","onPageScrollStateChanged state==>"+state);this.state=state;if(mCallback!=null&&state==ViewPager2.SCROLL_STATE_IDLE){mCallback.onPageChange(position);}}

MainActivity在页面切换后的刷新操作:

  @Overridepublic void onPageChange(final int index) {Log.d("daxiang", "onPageChange index==>" + index);stop();play(index);tempIndex = index;}/*** 处理多媒体播放视频的停止操作*/private void stop() {if (mMediaPlayer != null) {//&&mMediaPlayer.isPlaying()mMediaPlayer.stop();mMediaPlayer.release();mMediaPlayer = null;}}/*** 播放对应位置视频** @param index 位置*/private void play(int index) {String path = null;try {Log.d("daxiang", "index==>" + index + " result size==>" + result.size());if (result != null && result.size() > index) {path = result.get(index);binding.playpause.setVisibility(View.GONE);binding.seekbar.setVisibility(View.GONE);binding.currentTime.setVisibility(View.GONE);binding.totalTime.setVisibility(View.GONE);mMediaPlayer = new MediaPlayer();mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mMediaPlayer.setDataSource(path);surfaceView = mGxAdapter.getView(index);surfaceView.getHolder().addCallback(this);mMediaPlayer.setOnPreparedListener(this);mMediaPlayer.setOnCompletionListener(this);mMediaPlayer.prepare();}} catch (IOException e) {e.printStackTrace();}}

然后再MediaPlayer的OnPreparedListener回调方法中对对应的视频资源进行播放,如下:

 @Overridepublic void onPrepared(MediaPlayer mediaPlayer) {Log.d("daxiang", "onPrepared");if (mMediaPlayer != null) {mMediaPlayer.start();countTime = mMediaPlayer.getDuration();binding.seekbar.setMax(countTime);binding.currentTime.setText(GxUtils.timeConversion(0));binding.totalTime.setText(GxUtils.timeConversion(countTime));stopTimeLis = true;ExecutorsThreadManager.getInstance().submitThread(mPlayLisRunnable);}if (mMediaPlayer != null && surfaceView != null && surfaceView.isAttachedToWindow()) {mMediaPlayer.setDisplay(surfaceView.getHolder());}}

另外这里还有一些关于视频播放控制这块的逻辑就不做介绍了,有对应的代码可供参考,具体的地址如下:https://github.com/daxiangzaici214703306/GxPlayer.git

下面是实现的效果图

图中有双击弹出爱心的效果实现,在代码中可以参考,切曲可以上拉或者下拉或者点击旁边的按钮。

一个简单的视频播放器相关推荐

  1. 用Android做的一个简单的视频播放器

    視頻播放器项目功能需求 1 项目概述 1.1 项目描述 視頻播放器(以及視頻管理系統)是一款由java(Swing,安卓和数据库)做的手机视频播放器,可以看手机本地的各种视频,通过按钮进入手机视频管理 ...

  2. iOS 教你使用MP、AVPlayer、AVPlayerVC构建一个完整的视频播放器

    1.前言 标题必须要浮夸!要感觉像是一个大新闻.长者如是说. 其实是前几天去面试的时候,被要求说必须做过视频播放相关项目.有点闹心之余,就花了点时间在家写了一个简单播放器,基本实现了主流播放器的大致功 ...

  3. HTML实例——简单的视频播放器

    前两篇博文我们学习了HTML的表单事件与实现一个鼠标点击时,tab栏切换的实例 今天我们来实现一个简单的视频播放器 HTML--表单事件 HTML举例-鼠标点击时,tab栏切换 <!DOCTYP ...

  4. MediaCodec、OpenGL、OpenSL/AudioTrack 实现一款简单的视频播放器

    概述 功能很简单,大致流程为: 1) MediaCodec 解码视频文件得到 YUV.PCM 数据 2) OpenGL 将 YUV 转为 RGB,并渲染到 Surface 上 3) OpenSL/Au ...

  5. ArtVideoPlayer:一个灵活的视频播放器

    这是一个灵活的视频播放器. MediaPlayer与VideoView完全分开,可以替换为其他播放器内核,如ExoPlayer和ijkPlayer. 可以完全自定义播放器视图,我们称之为控制面板. 此 ...

  6. python写一个文件下载器_python使用tcp实现一个简单的下载器

    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...

  7. 利用MFC调用libvlc.dll作一个简单的播放器

    简单介绍MFC调用libvlc.dll作一个简单的播放器,抛砖引玉,各位VC++达人继续深入研究,Jeremiah对VC++确实不太感兴趣,所以就不做太深入的研究了. 2009.10.29修改:加入c ...

  8. spring诸如方式_一个简单的步进器,具有诸如下一步,返回和结束之类的简单动作,可以执行简单的表格

    spring诸如方式 Vue步进器. (Stepper for Vue.) A simple stepper with simple actions such as next, back and fi ...

  9. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

最新文章

  1. 【转】android开发工具Eclipse,androidStudio,adt网盘下载--不错
  2. Spring Cloud一站式的微服务架构解决方案
  3. Codeforces 1314 题解
  4. 我如何构建Kubernetes集群,以便我的同事可以更快地部署应用程序
  5. spark学习-Spark算子Transformations和Action使用大全(Action章)
  6. 创意信件风格论文答辩PPT模板
  7. 个人信用风险评估项目
  8. 关于java构造函数 的错误 there is no default constructor available in ...
  9. 望一望漫天星光(随笔)
  10. 基于Web实现在线绘画拓扑图[GraphEditor]
  11. BIM模型文件下载——四层仿古别墅模型
  12. Python——计算程序运行帧率(FPS)
  13. python webpy启动服务
  14. memcpy函数优化及DMA对比
  15. 前端工程师用代码制作特效,七夕情人节成功表白女神,终于摆脱单身
  16. c++读取wav音频方法
  17. pygal优雅地添加数据
  18. golang快速入门--爬虫--基于colly框架的爬虫案例
  19. 大腕出手看门道,谈BAT的投资战略差异 三家战略投资的思考原点并不相同虎嗅网)
  20. AndroidStudio设置代码自动提示以及字体大小设置

热门文章

  1. MySQL字符串是怎么截取substring函数的?
  2. 【linux】cpu过高解决方法
  3. 小i机器人助力运输类国企客服中心智能升级
  4. 安卓更新下载apk 并安装
  5. 分享一个门店会员管理系统模板
  6. yarn 系统找不到指定的路径
  7. Google Cloud Messaging:可折叠消息
  8. LearnOpenGL_study -- 光照贴图
  9. Linux安装防火墙学习
  10. php swfupload handlers.js,swfupload 批量上传源码