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的功能.所以我打 ...
随机推荐
- FFmpeg简易播放器的实现-音视频播放
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- 如何判断JavaScript数据具体类型
昨晚做了阿里的题目,让我写一个函数,可以判断数据的具体类型.其实题目很简单的...但是真的是自己不太注意吧,写的很糟糕啊. 然后今天就自己写了一个,然后又到晚上搜了下,看看别人的写法,结果发现自己有点 ...
- ApiGen 4.0配置项
Usage: generate [-s|--source="..."] [-d|--destination="..."] [--access-levels=&q ...
- C#Redis Sorted-Sets
一.前戏 Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score) ...
- 并发编程—— LinkedTransferQueue
1. 前言 Java 中总的算起来有 8 种阻塞队列. 我们分析了: 并发编程之 SynchronousQueue 核心源码分析 并发编程之 ConcurrentLinkedQueue 源码剖析 并发 ...
- [转]【mysql监控】查看mysql库大小,表大小,索引大小
本文转自:http://blog.sina.com.cn/s/blog_4c197d420101fbl9.html 查看所有库的大小 mysql> use information_schema; ...
- Linux下安装SQL Server 2016(连接篇SQL Server on linux)
连接数据库 (1)设置防火墙 要连接数据库,首先要打开防火墙上1433端口,也就是,增加tcp端口1433到公共区域,并且永久生效. [root@localhost Desktop]# firewal ...
- JUC源码1-原子量
什么是原子量,原子量就是一次操作,要么成功,要么失败.比如java中的i++ 或i-- , 不具备原子性,每次读取的值都是不一样的,探究其原因,x86体系中,他的总线是32位的,i++的操作指令必须是 ...
- thinkphp 网址后台典型页面
知识点: 1.select a提交后 返回选中项 选中项 value是id 但是要显示name b遍历和列举两种形式 <select name="class_id" clas ...
- abp运行机制分析
abp运行流程 由于公司现在大量向abp框架+react前后端分离架构转型,所以有必要分析abp框架是如何在iis运行的,所以才有这篇文章 public class MvcApplication : ...