Android高级_视频播放控件
一、Android系统自带VideoView控件
1. 创建步骤:
(1)自带视频文件放入res/raw文件夹下;
(2)声明初始化VideoView控件;
(3)创建视频文件Uri路径,Uri调用parse(),传入(”android.resource://”+getPackageName()+”/”+R.raw.video)当前字符串获取资源路径;
(4)为视频控件设置播放路径,VideoView对象调用setVideoURI(),传入Uri对象;
(5)开始播放,VideoView对象调用start();
2. 重写控件onMeasure(),设置VideoView的自定义宽高;MeasureSpec对象调用getSize()传入widthMeasureSpec常量和heighMeasureSpec常量获得屏幕宽度和高度,之后调用setMeasuredDimension(),传入宽度和高度设置控件的宽度和高度;
3. VideoView控制方法:
start():从当前位置启动视频;
pause():暂停视频;
isPlay():判断当前视频是否在播放;
getDuration():获得当前播放视频的总时长(单位:毫秒);
getCurrentPosition():获得当前视频播放时长(单位:毫秒);
4. VideoView监听事件:
setOnPreparedListener():视频准备监听,传入实现MediaPlayer.OnPreparedListener接口的对象,重写onPrepared(),视频准备播放之后调用此方法;
setOnCompletionListener():视频播放完成监听,传入实现MediaPlayer.OnCompletionListener接口的对象,重写onCompleted(),在视频播放完成之后调用此方法;
setOnErrorListener():视频播放错误监听,传入实现MediaPlayer.OnErrorListener接口的对象,重写onError(),在视频播放出错时调用此方法;
setOnTouchListener():触摸监听事件,传入实现View.OnTouchListener接口的对象,重写onTouch(),触摸控件之后调用此方法;
注意:该方法之后如果返回false,则event.getAction()只能监听到MotionEvent.ACTION_DOWN,无法监听到MotionEvent.ACTION_UP事件;而只有返回true,可以将触摸事件向下分发,才能监听MotionEvent.ACTION_UP事件;
5. VideoView与Seekbar结合的视频播放控件效果:
(1)初始化Seekbar和VideoView控件;
(2)使用本地路径创建Uri对象,Uri类调用静态方法parse(),传入资源路径字符串常量,视频保存路径为res/raw文件夹下,则字符串常量值为:"android.resource://"+getPackageName()+"/" + R.raw.video_test;
(3)关联VideoView的Uri路径,VideoView对象调用setVideoURI(),传入Uri对象;
(4)启动VideoView播放视频,VideoView调用start();
(5)为控制布局中的播放暂停按钮设置点击监听事件,传入实现onClickListener接口的对象,重写onClick(),在此方法内判断VideoView控件的视频是否播放,调用isPlaying(),如果正在播放,VideoView调用pause()暂停;否则VideoView调用start()开启,之后获取视频当前播放进度和总时长,放入Handler对象的消息队列中延时1000ms发送;
(6)为VideoView控件设值视频播放监听事件,调用setOnPreparedListener(),在重写的onPrepared()中获取当前播放进度和总时长,放入消息队列延迟1000ms发送;
(7)为Seekbar控件进度条设值拉动监听事件,调用setOnSeekBarChangeListener(),传入实现SeekBar.OnSeekBarChangeListener()接口的对象,重写onProgressChanged(),在该方法内判断fromUser为true时为VideoView设置进度,调用seekTo()传入用户拖动进度;之后先清空消息,再重新发送总时长和播放进度消息;
(8)为VideoView控件设置触摸事件监听,调用setOnTouchListener(),传入实现OnTouchListener接口的对象,重写onTouch(),在该方法内如果是按下事件,显示底部导航,同时3000ms后发送消息通知,隐藏底部导航;
(9)在消息处理事件中,先判断消息类型,如果是控制进度条的消息,重新设置进度条,之后再次发送VideoView的当前播放时间和总时长;如果是隐藏控制栏的消息类型,则控制栏调用setVisibility(),传入View.GONE;
二、Android系统底层SurfaceView控件
1. SurfaceView与MediaPlayer结合使用,代替VideoView的原因:VideoView中自带MediaPlayer,在ListView中的Item中多次使用之后会使系统内存过大;
2. 使用步骤:
(1)布局文件中创建SurfaceView控件,在Activity中声明并初始化该控件;
(2)声明并实例化MediaPlayer对象;
(3)获取SurfaceHolder对象,用于改变SurfaceView的像素点,SurfaceView对象调用getHolder();
(4)SurfaceHolder对象调用addCallback(),传入实现SurfaceHolder.Callback接口的对象,重写三个方法:
方法1:surfaceCreate():当SurfaceView创建时调用此方法,在此方法内开启视频播放;
方法2:surfaceChanged():SurfaceView在像素点发生改变时调用此方法;
方法3:surfaceDestroy():SurfaceView在销毁之后调用此方法;
(5)开启视频播放步骤:
(5-1)在视频播放前重置MediaPlayer,MediaPlayer对象调用reset();
(5-2)获取视频地址,创建Uri对象,Uri类调用静态方法parse(),传入资源路径,如“”android:resource://”+getPackageName()+”/”+R.raw.test”;
(5-3)改视频播放器设置SurfaceHolder,MediaPlayer对象调用setDisplay(),传入SurfaceHolder对象;
(5-4)关联视频播放地址,MediaPlayer对象调用setDataSource()传入上下文对象和Uri对象;
(5-5)开启异步准备视频,MediaPlayer对象调用prepareAsync()即可;
(6)为MediaPlayer设置准备完成监听事件,MediaPlayer对象调用setOnPreparedListener(),传入实现MediaPlayer.OnPreparedListener接口的对象,重写onPrepared(),在该方法内传入的形参MediaPlayer对象调用start();
Android高级_视频播放控件的更多相关文章
- 玩转Android之在线视频播放控件Vitamio的使用
其实Android中自带的MediaPlayer本身就能播放在线视频,MediaPlayer结合SurfaceView播放在线视频也是不错的选择(如果你没有性能或者用户体验上的要求),关于MediaP ...
- Android 高级编程 RecyclerView 控件的使用
RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object ↳ and ...
- Android高级图片滚动控件,编写3D版的图片轮播器
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...
- Android实现监听控件点击事件
Android实现监听控件点击事件 引言 这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不同,这里也略做介绍. 最近一直在忙一 ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- Android Material适配 为控件设置指定背景色和点击波纹效果
Android Material适配 为控件设置指定背景色和点击波纹效果,有需要的朋友可以参考下. 大部分时候,我们都需要为控件设置指定背景色和点击效果 4.x以下可以使用selector,5.0以上 ...
- Android开发之日历控件实现
Android开发之日历控件实现:以下都是转载的. 日历控件 日历控件 日历控件 日历控件
- android中的EditView控件
android中的EditView控件 EditText继承关系:View-->TextView-->EditText ,EditText是可编辑文本框 1.EditText默认情况下,光 ...
- 将VLC库封装为duilib的万能视频播放控件
转载请说明出处,谢谢~~ 昨天封装好了基于webkit的浏览器控件,修复了duilib的浏览器功能的不足,而我的仿酷狗播放器项目中不光需要浏览器,同时也需要视频播放功能,也就是完成MV的功能.所以我打 ...
随机推荐
- linux下md5sum用法 (查看文件或字符串的md5值)
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长 ...
- 动态绑定数据至Html Table
学习或是开发asp.net程序,如果你很不喜欢使用GridView,DataList或是Repeater控件去显示来自数据库的数据,你完全可以使用html的table来完成.今天Insus.NET还让 ...
- SQl常用语句总结(持续更新……)
创建示例数据库 USE master; GO IF DB_ID (N'mytest') IS NOT NULL DROP DATABASE mytest; GO CREATE DATABASE myt ...
- .net 多线程的使用(Thread)
上篇 net 同步异步 中篇 多线程的使用(Thread) 下篇 net 任务工厂实现异步多线程 Thread多线程概述 上一篇我们介绍了net 的同步与异步,我们异步演示的时候使用的是委托多线程来实 ...
- git 提交规范
git 提交规范 前言 无规矩不成方圆,编程也一样. 如果你有一个项目,从始至终都是自己写,那么你想怎么写都可以,没有人可以干预你.可是如果在团队协作中,大家都张扬个性,那么代码将会是一团糟,好好的项 ...
- 【Java基础】6、java中使用switch-case的用法及注意事项超全总结
1.switch-case注意事项: switch(A),括号中A的取值只能是整型或者可以转换为整型的数值类型,比如byte.short.int.char.还有枚举:需要强调的是:long和Strin ...
- Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)
上次分享了支付宝订单退款的代码,今天分享一下支付宝转账的操作. 现在是有一个余额提现的功能,本来是打算做提现到银行卡的,但是客户嫌麻烦不想注册银联的开放平台账户,就说先提现到支付宝就行,二期再做银行 ...
- 使用"+"进行字符串拼接
本文来自:Hollis(微信号:hollischuang) 字符串,是Java中最常用的一个数据类型了.本文,也是对于Java中字符串相关知识的一个补充,主要来介绍一下字符串拼接相关的知识.本文基于j ...
- 实例化Flask的参数 及 对app的配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- python去掉字符串中空格的方法
1.strip():把头和尾的空格去掉 2.lstrip():把左边的空格去掉 3.rstrip():把右边的空格去掉 4.replace('c1','c2'):把字符串里的c1替换成c2.故可以用r ...