前言
根据项目要求 做一个淘宝今日头条的功能 要求实现图文
和视频
的混排
在之前的博客中我已经写了头条滚动demo
———今日头条的demo地址
就是这样的一个效果 点击这个控件后 进入↓↓↓
头条的页面
这篇博客主要是记录视频的使用 关于文本的加载 请看我另一篇博客 Android 富文本
下面进入正题
第一步 导入依赖
github官方给出的地址是:
compile 'cn.jzvd:jiaozivideoplayer:6.2.12'
需要修改为:
implementation 'cn.jzvd:jiaozivideoplayer:6.2.12'
因为我用的android studio的版本已经超过3.0 compile
已过期 如果不修改直接复制到自己的gradle中
会导致编译报错的 !
@至于为什么要修改compile为implementation
我去搜了一下 得到的答案是: 1. 加快编译速度。2. 隐藏对外不必要的接口。具体细节 自行搜索答案
说到这里 我不得不多说一下 自己在添加这个库的时候 还遇到了一个问题 也分享出来!
如果要用到这个视频播放的第三方控件 SDK版本必须大于15 也就是最低为16 下面我贴出自己的配置
其中minSdkVersion 16
就是我改过的 如果你也遇到此问题 直接将minSdkVersion改为16即可编译通过
defaultConfig {
applicationId "com.jxty.app.garden"
minSdkVersion 16
targetSdkVersion TARGET_SDK_VERSION as int
versionCode VERSION_CODE as int
versionName VERSION_NAME
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
}
第二步 添加布局文件
自行根据需求来设置属性的
<cn.jzvd.JZVideoPlayerStandard
android:id="@+id/m_video"
android:layout_width="0dp"
android:layout_height="200dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
第三步 设置视频地址、缩略图地址、标题
JZVideoPlayerStandard videoPlayer; //视频播放器
TextView mTvExplain, mTvExplainDetails;//视频的标题和简介文本框
private void init() {
//初始化组件
videoPlayer = findViewById(R.id.m_video);
mTvExplain = findViewById(R.id.tv_explain);
mTvExplainDetails = findViewById(R.id.tv_explain_details);
for (int i = 0; i < headLineVideoList.size(); i++) {
Article article = headLineVideoList.get(i);
String videoUrl = article.getVideoUrl();//从后台返回的集合中 获取播放视频的Url
//设置视频地址、缩略图地址、标题
videoPlayer.setUp(videoUrl, JZVideoPlayerStandard.SCREEN_WINDOW_NORMAL, "锦绣田园");
//设置视频的标题和简介文本框
mTvExplain.setText(article.getTitle());
videoDetails = article.getVideoSummary();
//如果视频简介返回空 就取视频抬头
mTvExplainDetails.setText(videoDetails.equals("") ? article.getTitle() : videoDetails);
}
}
第四步 执行暂停和返回时的调用
在包含播放器的Fragment或Activity的onPause()方法中调用JCVideoPlayer.releaseAllVideos()。相对应的生命周期里面要做相对应的操作:
@Override
public void onBackPressed() {
if (JZVideoPlayer.backPress()) {
return;
}
super.onBackPressed();
}
@Override
protected void onPause() {
super.onPause();
JZVideoPlayer.releaseAllVideos();
}
作为合格的码农一定要有一颗好奇心 看到这里的方法 我禁不起好奇 还是点进去看了一下源码
了解到JZVideoPlayer.backPress()
原来是RxJava的背压概念
@何为背压?
- 被观察者产生事件慢一些,观察者处理事件很快。那么观察者就会等着被观察者发送事件,(好比观察者在等米下锅,程序等待,这没有问题)。
- 被观察者产生事件的速度很快,而观察者处理很慢。那就出问题了,如果不作处理的话,事件会堆积起来,最终挤爆你的内存,导致程序崩溃。(好比被观察者生产的大米没人吃,堆积最后就会烂掉)。
下面当暂停的时候 执行的方法JZVideoPlayer.releaseAllVideos()
只看字面意思,我们也能想到是释放资源的方法 我也点了进去 下面是源码
意思是如果 当前时间减去点击退出全屏时间的时间大于全屏正常延迟 即执行释放缓冲区的视频
if ((System.currentTimeMillis() - CLICK_QUIT_FULLSCREEN_TIME) > FULL_SCREEN_NORMAL_DELAY) {
Log.d(TAG, "releaseAllVideos");
JZVideoPlayerManager.completeAll();
JZMediaManager.instance().positionInList = -1;
JZMediaManager.instance().releaseMediaPlayer();
}
第五步 在AndroidManifest.xml配置
<activity
android:name=".main.headline.HeadlineVideoActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait" />
其中android:configChanges="orientation|screenSize|keyboardHidden"
是横竖屏切换时,禁止activity重新创建
而 android:screenOrientation="portrait"
限制此页面数竖屏显示
运行看效果
小屏幕播放
全屏后横屏的效果
细心的人会发现 进度条的在下面 有一个细条 当手触摸到屏幕 会弹出暂停
和返回
按钮
写一个简单的东西 往往会遇到各种小的问题 在解决这些问题的同时 我们就学会了成长!
希望自己继续努力!!