MediaPlayer+SeekBar暂停快进快退
MediaPlayer+SeekBar暂停快进快退
- 首先是,如何能够播放一个视频(网络权限小伙伴们自己盘上)
- 然后是进度条Seekbar
- 然后是点击时改变视频播放进度
- 最后是暂停和继续,
- INTERESTING!!!
今天学习了音乐播放器超低配版,但是我已经很满足了,因为她没有广告…
话不多说让我们来看一下实现过程吧
首先供上布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:padding="20dp"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="400dp" /><ProgressBarandroid:id="@+id/progressBar"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center" /></FrameLayout><LinearLayoutandroid:layout_above="@id/mypro"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/left_i"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginRight="80dp"android:background="@drawable/back"/><ImageViewandroid:id="@+id/cen"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginRight="80dp"android:background="@drawable/a7r" /><ImageViewandroid:id="@+id/right_i"android:layout_width="50dp"android:layout_height="50dp"android:background="@drawable/goon"/></LinearLayout><SeekBarandroid:id="@+id/mypro"style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"/>
</RelativeLayout>
出来是这么个样子
颜值方面尽力了,她要是长的比我好看了我就该酸了
然后来上代码实现,先来个整体的,然后分开说一下
public class MainActivity extends AppCompatActivity {private SurfaceView surfaceView;private MediaPlayer player;private SurfaceHolder holder;private ProgressBar progressBar;private SeekBar mypro;ImageView left,right,cen;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);progressBar= (ProgressBar) findViewById(R.id.progressBar);mypro = findViewById(R.id.mypro);cen = findViewById(R.id.cen);left = findViewById(R.id.left_i);right = findViewById(R.id.right_i);//视频链接可能已失效String uri="http://vfx.mtime.cn/Video/2019/03/19/mp4/190319125415785691.mp4";player=new MediaPlayer();try {player.setDataSource(this, Uri.parse(uri));holder=surfaceView.getHolder();holder.addCallback(new MyCallBack());player.prepare();player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {progressBar.setVisibility(View.INVISIBLE);player.start();player.setLooping(true);}});} catch (IOException e) {e.printStackTrace();}mypro.setMax(player.getDuration());final Handler handler = new Handler();final Runnable updateThread = new Runnable() {public void run() {if (player != null) {mypro.setProgress(player.getCurrentPosition());handler.postDelayed(this, 100);}}};new Thread(updateThread).start();mypro.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {handler.removeCallbacks(updateThread);}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {player.seekTo(seekBar.getProgress());handler.postDelayed(updateThread, 1000);}});cen.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (player.isPlaying()) {player.pause();//暂停播放cen.setImageResource(R.drawable.a7r);} else {player.start();//继续播放cen.setImageResource(R.drawable.a7v);}}});left.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {handler.removeCallbacks(updateThread);player.seekTo(player.getCurrentPosition()-1000);handler.postDelayed(updateThread, 1000);}});right.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {handler.removeCallbacks(updateThread);player.seekTo(player.getCurrentPosition()+2000);handler.postDelayed(updateThread, 1000);}});}private class MyCallBack implements SurfaceHolder.Callback {@Overridepublic void surfaceCreated(SurfaceHolder holder) {player.setDisplay(holder);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}
}
抱歉没能养成打注释的好习惯,我们就来看一下吧
首先是,如何能够播放一个视频(网络权限小伙伴们自己盘上)
通过给播放器设置Uri数据源,先prepare准备然后打开监听通过start播放
Loogping设置为循环播放,有其他需求的小伙伴可以做,但是需要另外在线程加判断了
然后是进度条Seekbar
这是一个进度条实时更新监听,通过handle接收,线程中没0.1秒跟进一次
然后是点击时改变视频播放进度
这个地方没什么可说的,就是在点击时先断掉监听,然后重新设置进度,再打开监听
快进慢进的实现和这个原理一样,后面我就不单独拿出来了,需要的去上面找
最后是暂停和继续,
先通过isPlaying判断当前的状态
然后分别调用pause和start,同时改变图标样式m
因为是在不会发动图没法给各位看效果,抱歉喽
INTERESTING!!!
MediaPlayer+SeekBar暂停快进快退相关推荐
- Android FFmpeg系列——7 实现快进/快退功能
Android FFmpeg系列--0 编译.so库 Android FFmpeg系列--1 播放视频 Android FFmpeg系列--2 播放音频 Android FFmpeg系列--3 C多线 ...
- vue项目视频实现键盘快进快退,音量调大小及监听播放事件
直接上代码 <div style="padding-top:56.25%" ><video style="width:100%;height:672px ...
- Silverlight 5 beta新特性探索系列:9.视频快进快退和TextSearch对象对文字项查询
本节讲诉两个新特性:一.在Silverlight 5中可以控制MediaElement对象播放的视频进行快进快退控制.二.在Silverlight 5中的文字项进行搜索查询. 一.对于MediaEle ...
- python 循环播放音乐_python gstreamer实现视频快进/快退/循环播放功能
这篇文章主要介绍了python gstreamer 实现视频快进/快退/循环播放功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 Gstreamer到底是个啥? ...
- 安卓平板倍速_推荐:安卓上本地音频播放器,可实现5秒快进快退和倍速播放...
前一篇文章推荐过一个app,但那app没倍速播放功能.我又找到了一个更完美的app 安卓手机上我自己需要这样一款app,主要用来听电子书,知识音频等.需要能实现快进快退几秒钟的以及倍速播放功能.这功能 ...
- 十、FFmpeg视频播放之快进快退
1.处理快进快退(seek)命令 本章我将给大家讲解怎么给我们的播放器添加快进.快退.定位功能,这也是几乎所有播放器都有的功能.为实现此功能,我们要用到av_seek_frame函数,这个函数非常简单 ...
- Java后端处理video快进快退播放以及断点续传的原理和代码
video 快进快退的原理: 通过对所在服务器上的流媒体进行skip操作,然后再response的header里设置相应的Content-Range以及其他属性,来控制视频流的快进快退的功能. 断点续 ...
- ts, mp4文件快进快退(seek)原理
最近用potplayer播放一些ts文件,seek(快进快退)发现会有卡顿问题,但是同一个文件用mp4转封装之后seek就很快很流畅了.所以抽空研究了ffplay 对mp4文件和ts文件的 seek ...
- ffmpeg播放器快进快退(七)
指导7:快进快退 处理快进快退命令 现在我们来为我们的播放器加入一些快进和快退的功能,因为如果你不能全局搜索一部电影是很让人讨厌的.同时,这将告诉你av_seek_frame函数是多么容易使用. 我们 ...
最新文章
- 安全与透明:智能互联网的基石
- MVC3 ActionResult 返回类型
- boost::prior用法的测试程序
- python,面向对象的各种方法
- Vue2.0中子组件向父组件传递数据的方法,以完整demo演示
- 猜数字游戏python程序_python经典小程序:猜数字游戏
- 洪筱楠(1996-),女,对外经济贸易大学国际经济贸易学院经济学荣誉学士实验班本科生。...
- cms php上传失败,PHPCMSV9无法上传附件,提示空信息的超级bug
- android jni socket
- PS打造电影金属字体
- 绩效/加薪/年终奖,虐你如初恋
- F-score is ill-defined and being set to 0.0 due to no predicted samples.
- 【JUC】并发编程(二)
- 机器学习在饿了么竞价广告中的实践
- 微信支付服务器错误,【支付问题】微信支付宝支付超时、支付异常解决办法
- 应用程序正常初始化(0xc00000005)失败.请单击“单击”,终止应用程序
- Keystore介绍
- 目的:使用CUDA环境变量CUDA_VISIBLE_DEVICES来限定CUDA程序所能使用的GPU设备
- java后台 重置手机密码(邮箱点击确认)
- 基于php食堂外卖系统
热门文章
- Zener Diode(雪崩二极管/齐纳二极管)
- 【TBox】【诊断】UDS
- linux挂载光盘的命令,Linux下挂载光驱的方法
- Kubernetes容器网络(二):Calico网络原理
- 微软即将推出的Lumia 950/950 XL配置
- 苹果无敌了!颠覆了手机行业又要来颠覆安全套行业
- mysql pid not found,mysql 启动错误-server PID file could not be found 的解决办法
- pythonic_6种Pythonic位操作配方
- 石头扫地机器人离线了怎么办_石头扫地机器人T6使用教程
- Android——学习计步器心得(一)