之前在自己的一个项目中用到过视频播放,今天抽空把遇到的坑都写下来,顺便给将要用到的朋友提个醒。

首先说下开源的视频播放框架有好几个,我这里主要讲我用到的这个,那就是Vitamio。有关vitamio的详细介绍,有一位朋友写了比较详细的介绍,也是开发者之一,有时间的朋友可以移步这里。

一.项目导入:

我是用Android Studio开发的,将vitamio以一个module导入,再它作为一个依赖注入到需要使用的项目。eclipse的话同样将vitamio工程导入再设置成一个library即可。

Vitamio下载。下载后只导入vitamio包下的代码即可,sample当然也可以看看。as导入后可能会有报错的现象,这是因为sdk版本不一致的原因造成的,只需把Vitamio项目中build.gradle文件里的以下字段修改下

android {compileSdkVersion 24 //修改版本和原项目保持一致buildToolsVersion "24.0.2" //修改版本和原项目保持一致defaultConfig {minSdkVersion 14 //修改版本和原项目保持一致targetSdkVersion 24 //修改版本和原项目保持一致}

二.使用

在Manifest文件中声明Vitamio需要使用的初始化Activity,播放网络视频的话还有联网权限,我这次测试用的就是播放联网视频。

<activity android:name="io.vov.vitamio.activity.InitActivity" android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden"android:launchMode="singleTop"android:theme="@android:style/Theme.NoTitleBar"android:windowSoftInputMode="stateAlwaysHidden"/>

在activity的onCreate方法前添加如下代码检测是否成功导入相关资源如.so文件

public void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this))return;setContentView...//你的代码
}

布局文件声明,外层用一个FrameLayout包裹背景设置为黑色(全屏时若背景不是黑色视频又不能完全贴合屏幕会留白很难看)。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/fl_video_group"android:background="@android:color/black"android:layout_width="match_parent"android:layout_height="wrap_content"><io.vov.vitamio.widget.VideoViewandroid:id="@+id/videoView"android:layout_width="match_parent"android:layout_height="200dp"/></FrameLayout>
</LinearLayout>

好啦,现在来测试运行下


现在有个问题,controller的布局怎么在页面最底部,想象中应该是在VideoView的底部,还有个小bug是 会往上跳(如VideoView上面有个button的话这时就只有一半可见了,暂时没发现因为什么原因)。只有看看源码了,后发现源码中Controller是以PopupWindow的方式添加到屏幕上的。贴上其中关键一小段代码

      if (mFromXml) {setVisibility(View.VISIBLE);} else {int[] location = new int[2];mAnchor.getLocationOnScreen(location);Rect anchorRect = new Rect(location[0], location[1], location[0] + mAnchor.getWidth(), location[1] + mAnchor.getHeight());
    mWindow.setAnimationStyle(mAnimStyle);setWindowLayoutType();mWindow.showAtLocation(mAnchor, Gravity.NO_GRAVITY, anchorRect.left, anchorRect.bottom);}

mAnchor是VideoView的父View(若宽高是match_parent),而这里location又是使用的mAnchor的left和bottom作为PopupWindow的显示位置,所以自然都是在最下方了。这是mFromXml为false的情况(使用一个参数的Controller构造方法都会走到这),如果为true的话可以看到直接设置显示就OK了,那我们能不能直接让它走true的情况呢,其实true就代表把Controller添加到一个父View中,由于代码过多就不一一贴上来了,直接出个解决方案吧。简单起见我们给MediaController增加一个构造方法,把父容器传进来然后将controller添加到其中,把mFromXml赋值为true,给Controller添加布局参数。代码如下:

public MediaController(Activity activity, boolean fromXml, View container) {super(activity);//此处初始化了AudioManager和ContextinitController(activity);//此处的activity是为后面获取当前屏幕方向而准备。接受Context类型再强制转换为activity也行。mActivity = activity;//设置mFromXml为truemFromXml = fromXml;//初始化Controller布局文件mRoot = makeControllerView();if(container instanceof FrameLayout){FrameLayout.LayoutParams p = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
      //在父View底部p.gravity = Gravity.BOTTOM;mRoot.setLayoutParams(p);((FrameLayout)container).addView(mRoot);}
}

好再来看下效果

差不多就这样吧,到现在要实现大小屏切换了,先需要优化下布局,增加大小屏切换按钮、缩略图、点击开始图片按钮,我觉得controller太高了而且带文件名不好看(有更改文件名的方法,默认显示URL截取最后一个 / 之后的内容),我就不贴布局文件了直接看效果吧。

              

三.大小屏流畅切换

至于全屏的话我的方法就是将要隐藏的View添加到一个集合中,再根据需要遍历隐藏和显示。我是强制设置了竖屏,只能通过点击图片按钮切换。记得在当前activity声明这些属性

android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden|screenLayout|screenSize"

然后重写activity的onConfigurationChanged方法,当屏幕发生变化的时候通过回调判断当前是横向还是纵向,再进行放大缩小。还有就是隐藏系统通知栏等

//这两个方法
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

到现在基本完成全屏播放了,录屏效果不好做不了gi图,而且上传大小又有限制就用图片代替了,可以看到上面这个视频边上还是有点空白,黑色还相对可以忍受。

其实还有很多东西可以优化,比如监听触摸事件,通过滑动控制音量大小、亮度等。我当时就两个很简短的视频,没有在这上面花特别多心思,如果你项目视频较多的话当然是需要更进一步的优化的。还有给个小提示是个人开发者现在没办法发布带有视频的应用,我当时那个侥幸在应用宝、百度、和豌豆荚通过了,360就不行。

就到这了吧,还有些细节你们有兴趣的话可以看看我的源码,为了不误导大家又重新写了一遍顺便截图,有点累... 有错误的话请留言指正,谢谢!

源码下载

android使用Vitamio实现视频播放大小屏流畅切换相关推荐

  1. android 使用vitamio播放mkv文件实现音轨切换

    最近公司需要开发一款能够播放mkv文件格式的视频,并且可以切换音轨,实现原唱和伴奏功能,在网上找了很长时间才找到,亲测实用,以下是代码实现,希望对大家有用. ps:如果找不到getAudioTrack ...

  2. Android视频播放器实现小窗口和全屏状态切换

    Android视频播放器实现小窗口和全屏状态切换 实在是不好意思,楼下评论的兄弟久等了,这文章一直没写第一是没时间,第二是自己准备也不充足,最近才看了好几个Android视频播放器的开源项目,才对视频 ...

  3. Android 自定义viewpage + videoview 实现竖屏视频播放效果

    Android 自定义viewpage + videoview 实现竖屏视频播放效果 效果图 实现步骤 前提概要 自定义 viewpage 自定义 videoview 主逻辑代码 效果图 由于用的是v ...

  4. android屏幕常亮adaptive,连LG都要抄袭?HTC拍照新机也玩大小屏设计

    还有两天HTC新品发布会便将拉开帷幕,而传说中的发布会主角HTC Ocean Note现在也有最新谍照和相关信息浮出水面,主要特色是采用了类似LG V20的大小屏设计,位于前置镜头旁边的小屏可以显示实 ...

  5. Android中Vitamio视频框架学习

    概述 开发公司一个乐视TV项目时,本来有个播放视频广告的功能,到最后不了了之.虽然没有在项目中做要求,但是这个点子还是激起了我研究多媒体的好奇心.刚好后面遇到一款比较喜欢的视频APP魔力盒,上面视频播 ...

  6. Android进阶:自定义视频播放器开发(上)

    随着快手,抖音,西瓜视频等视频APP的崛起,视频播放已经成为主流,此时作为Android研发的你,想要提高自己的能力还不知道怎么开发视频播放器怎么行?所以今天就带着大家一起开发一个简易播放器:Smal ...

  7. android实现长截屏,Android实现全屏截图或长截屏功能

    本文实例为大家分享了Android实现全屏截图或长截屏功能的具体代码,供大家参考,具体内容如下 全屏截图: /** * 传入的activity是要截屏的activity */ public stati ...

  8. Android杂谈---获取手机屏幕大小

    Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...

  9. android+note2+分辨率,Android自适应屏幕方向、大小和分辨率

    屏幕大小 1.不同的layout Android手机屏幕大小不一,有480x320,640x360,800x480.怎样才能让App自动适应不同的屏幕呢?其实很简单,只需要在res目录下创建不同的la ...

最新文章

  1. Jenkins + sonarqube集成实现发布代码审计
  2. 轻量型「孟子」模型比肩千亿大模型!AI大牛周明率队刷新CLUE新纪录
  3. spring第二冲刺阶段第十三天
  4. python最基本的规则是关键字吗,Python 关键字
  5. 计算机代码清单目录,(程序源代码清单.doc
  6. 32位/64位WIN2003各版本支持内存列表 彻底解决XP系统无法支持4G内存的问题
  7. 近年来最流行网络词汇及论坛用语
  8. [原]VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(上)
  9. Windows密码查看器实现原理
  10. Python实现批量Word转PDF
  11. c语言编程输出一到十,c语言编程输出1?
  12. 多渠道打包中优雅的配置渠道签名
  13. 二十一世纪的计算研讨会及启示
  14. Navicat 被投毒了 | 调查结果来了
  15. 【整理自官方公开资料】CSDN博主排名影响因素
  16. centos-linux(64位)安装与配置
  17. java 虚拟机 Java内存结构 JVM垃圾回收机制算法
  18. 龙芯版UOS 自带浏览器无法使用flash在线播放视频
  19. 【数学建模】MATLAB应用实战系列(110)-机器人路径规划——快速扩展随机树(Rapidly-exploring Random Trees)(附Python代码)
  20. python登陆百度网盘_百度网盘命令行版本bypy

热门文章

  1. 拓嘉启远电商:拼多多编写标题怎样才可以避开违规
  2. 三线一单”大气环境质量底线体系与划分技术方法
  3. js正则表达式匹配纯中文或纯英文
  4. 网站SEO其实很简单,新手必看!!!
  5. 程序人生 - 如何绘制二维码?
  6. 怎样把照片中的头像扶正_礼仪|职场人士微信头像怎么选才得体?
  7. a73*2+a53*2指的是什么_考验你脑细胞的时候到了!杨花落尽子规啼,闻道龙标过五溪中的子规指的是什么?|考验|脑细胞-360GAME...
  8. Python中文社区开源项目扶持计划
  9. mac +xcode 下WebDriverAgent环境配置
  10. 硬盘柱面损坏怎么办_硬盘扇区损坏怎么办