一、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高级_视频播放控件的更多相关文章

  1. 玩转Android之在线视频播放控件Vitamio的使用

    其实Android中自带的MediaPlayer本身就能播放在线视频,MediaPlayer结合SurfaceView播放在线视频也是不错的选择(如果你没有性能或者用户体验上的要求),关于MediaP ...

  2. Android 高级编程 RecyclerView 控件的使用

    RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object    ↳ and ...

  3. Android高级图片滚动控件,编写3D版的图片轮播器

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...

  4. Android实现监听控件点击事件

    Android实现监听控件点击事件 引言 这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不同,这里也略做介绍. 最近一直在忙一 ...

  5. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  6. Android Material适配 为控件设置指定背景色和点击波纹效果

    Android Material适配 为控件设置指定背景色和点击波纹效果,有需要的朋友可以参考下. 大部分时候,我们都需要为控件设置指定背景色和点击效果 4.x以下可以使用selector,5.0以上 ...

  7. Android开发之日历控件实现

    Android开发之日历控件实现:以下都是转载的. 日历控件 日历控件 日历控件 日历控件

  8. android中的EditView控件

    android中的EditView控件 EditText继承关系:View-->TextView-->EditText ,EditText是可编辑文本框 1.EditText默认情况下,光 ...

  9. 将VLC库封装为duilib的万能视频播放控件

    转载请说明出处,谢谢~~ 昨天封装好了基于webkit的浏览器控件,修复了duilib的浏览器功能的不足,而我的仿酷狗播放器项目中不光需要浏览器,同时也需要视频播放功能,也就是完成MV的功能.所以我打 ...

随机推荐

  1. 白话js this指向问题

    前言   通过本文,你大概能了解this基础指向的问题,抛开例子去说this太虚幻,这里还是结合几篇博文做个整理,算是个人的记录了. 先说概念,this指向与申明无关,永远指向距离自己最近的最终调用者 ...

  2. 解决U盘拷贝时提示文件过大问题(不能拷贝超过4个g的文件)

    为什么一个16G的U盘却拷不进一个4G大点的文件呢,想必很多朋友们都在疑问? 其实这跟U盘的磁盘格式有关,目前市面上常用的U盘大都是FAT32格式,我们可以查看U盘属性. 那么FAT32是什么呢? F ...

  3. UVa 442 Matrix Chain Multiplication(栈的应用)

    题目链接: https://cn.vjudge.net/problem/UVA-442 /* 问题 输入有括号表示优先级的矩阵链乘式子,计算该式进行的乘法次数之和 解题思路 栈的应用,直接忽视左括号, ...

  4. smarty 模板标签

    smarty 模板标签 变量标签 数组变量标签 变量调节器 条件标签 循环标签 数组变量标签 模板加载标签 预定义变量标签 常量标签

  5. 浅谈JSONP (vue-jsonp组件 XXXtoken:报错处理)

    由于同源策略的存在,特别是前后端两个项目存在的情况下,客户端访问服务端必然存在跨域的情况,而使用jsonp,则不存在这个问题. 主要是因为jsonp是在页面中插入一段js代码,而请求返回的也是一段js ...

  6. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明的名 ...

  7. PHP的openssl_encrypt方法的JAVA和JS的实现

    这次在JAVA项目中遇到了要使用PHP的openssl_encrypt这个方法来进行加密以下是内容分享: 在PHP中加密内容是: // openssl_encrypt($data, $method, ...

  8. 【Java深入研究】3、HashMap源码解析(jdk 1.7)

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  9. Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了

    目录 引言 构建示例 match operator 参数 analyzer lenient 参数 Fuzziness fuzzniess 参数 什么是模糊搜索? Levenshtein Edit Di ...

  10. Android-消息处理学习总结(Handler,Looper)

    参考资料: http://www.cnblogs.com/qlky/p/5657924.html http://blog.csdn.net/guolin_blog/article/details/99 ...