android 上下翻页素材,【Android 进阶】仿抖音系列之翻页上下滑切换视频(四)...

前言

大家好,这是这个系列的第四篇,在阅读这篇文章之前,建议可以先看下之前系列的文章,为了节省篇幅,之前详细说过的地方,这里就不再详细描述了:

这一篇,要说实现的是第一篇中的翻页切换视频。

思路

在第一篇中,我们用的是垂直滑动的ViewPager加Fragment 实现,详细过程可以看看第一篇文章。这里,我们用RecyclerView 加SnapHelper来实现。

问题

什么是 SnapHelper?

SnapHelper是一个抽象类,官方提供了一个LinearSnapHelper的子类,可以让RecyclerView滚动停止时相应的Item停留中间位置。在25.1.0版本中,官方又提供了一个PagerSnapHelper的子类,可以使RecyclerView像ViewPager一样的效果,一次只能滑一页,而且居中显示。详细源码解读可以看这里让你明明白白的使用RecyclerView——SnapHelper详解,这里我们用到的就是PagerSnapHelper

如何使用

使用非常简单,只需要创建对象之后调用attachToRecyclerView()附着到对应的RecyclerView对象上就可以了。

snapHelper = new PagerSnapHelper();

snapHelper.attachToRecyclerView(rvPage2);

复制代码

下来是组装数据,这里还是用之前的视频

urlList = new ArrayList<>();

urlList.add("http://image.38.hn/public/attachment/201805/100651/201805181532123423.mp4");

urlList.add("http://image.38.hn/public/attachment/201803/100651/201803151735198462.mp4");

urlList.add("http://image.38.hn/public/attachment/201803/100651/201803150923220770.mp4");

urlList.add("http://image.38.hn/public/attachment/201803/100651/201803150922255785.mp4");

urlList.add("http://image.38.hn/public/attachment/201803/100651/201803150920130302.mp4");

urlList.add("http://image.38.hn/public/attachment/201803/100651/201803141625005241.mp4");

urlList.add("http://image.38.hn/public/attachment/201803/100651/201803141624378522.mp4");

urlList.add("http://image.38.hn/public/attachment/201803/100651/201803131546119319.mp4");

复制代码

设置Adapter

videoAdapter = new ListVideoAdapter(urlList);

layoutManager = new LinearLayoutManager(Page2Activity.this, LinearLayoutManager.VERTICAL, false);

rvPage2.setLayoutManager(layoutManager);

rvPage2.setAdapter(videoAdapter);

复制代码

Adapter 代码如下,这里和第二篇中使用的Adapter 一致,其中的MyVideoPlayer 是基于 JiaoZiVideoPlayer的自定义的播放,在第二篇【Android 进阶】仿抖音系列之列表播放视频(二)和第三篇【Android 进阶】仿抖音系列之列表播放视频(三) 中已经有详细的描述,这里不再赘述了。

class ListVideoAdapter extends BaseRecAdapter{

public ListVideoAdapter(List list){

super(list);

}

@Override

public void onHolder(VideoViewHolder holder, String bean, int position){

holder.mp_video.setUp(bean, JZVideoPlayerStandard.CURRENT_STATE_NORMAL);

if (position == 0) {

holder.mp_video.startVideo();

}

Glide.with(context).load(bean).into(holder.mp_video.thumbImageView);

holder.tv_title.setText("第" + position + "个视频");

}

@Override

public VideoViewHolder onCreateHolder(){

return new VideoViewHolder(getViewByRes(R.layout.item_page2));

}

}

public class VideoViewHolder extends BaseRecViewHolder{

public View rootView;

public MyVideoPlayer mp_video;

public TextView tv_title;

public VideoViewHolder(View rootView){

super(rootView);

this.rootView = rootView;

this.mp_video = rootView.findViewById(R.id.mp_video);

this.tv_title = rootView.findViewById(R.id.tv_title);

}

}

复制代码

item_page2.xml 布局如下

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/tv_title"

android:layout_width="match_parent"

android:layout_height="50dp"

android:gravity="center"

android:textSize="18sp" />

android:id="@+id/mp_video"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent" />

复制代码

需要注意的是,RecyclerView 的默认布局父布局不是充满全屏的,就算我们在布局中设置match_parent也是没用,需要在onHolder中添加如下代码,重新设置

ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();

layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;

复制代码

到这里,基本功能已经实现,我们需要做的就是当RecyclerView 滑动时,播放当前可见的视频,暂停不可见的视频。这里我们用的还是第二篇提到的onScrollStateChanged 监听。

相比之前,这里的逻辑简单的多了,由于每次只有1个item处于可见状态,我们就只需要在停止滑动时,播放当前可见的视频,暂停其余不可见的视频。

rvPage2.addOnScrollListener(new RecyclerView.OnScrollListener() {

@Override

public void onScrolled(RecyclerView recyclerView, int dx, int dy){

}

@Override

public void onScrollStateChanged(RecyclerView recyclerView, int newState){

switch (newState) {

case RecyclerView.SCROLL_STATE_IDLE://停止滚动

View view = snapHelper.findSnapView(layoutManager);

JZVideoPlayer.releaseAllVideos();

RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(view);

if (viewHolder != null && viewHolder instanceof VideoViewHolder) {

((VideoViewHolder) viewHolder).mp_video.startVideo();

}

break;

case RecyclerView.SCROLL_STATE_DRAGGING://拖动

break;

case RecyclerView.SCROLL_STATE_SETTLING://惯性滑动

break;

}

}

});

复制代码

这样就差不多大功告成了,最后别忘记在Activity 不可见时,暂停所有视频

@Override

public void onPause(){

super.onPause();

JZVideoPlayer.releaseAllVideos();

}

复制代码

最后,献上完整代码。Github

你的认可,是我坚持更新博客的动力,如果觉得有用,就请点个赞,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[jQuery] jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this

[jQuery] jQuery.fn的init方法返回的this指的是什么对象&#xff1f;为什么要返回this init()方法中返回的this指向init的实例对象&#xff0c;而init.prototype等于jQuery.prototype&#xff0c;所以也是jQuery的实例对象&#xff1b;返回this是为了实现链式调用个人简介 我…

SAP OData $batch processing

例として、1回の呼び出しで100個の新しい商品を作成したい場合、最も簡単な方法は、$ batch要求を使用して100個のPOST呼び出しすべてを単一のサービス呼び出しにまとめることです。 URIの末尾にsap-statistics trueオプションを追加すると、所要時間についての詳細が表示され…

注册assembly的问题

.net framwork 1.1 手动注册 Policy.....开头的 Assembly 时候&#xff0c;一定要有 同名的.config 档存在&#xff0c;否则 提示&#xff1a;不符合强命名规则。 转载于:https://www.cnblogs.com/frankbaul/archive/2008/02/19/1073885.html

android模拟器上传,电脑文件怎么传到夜神android模拟器 文件上传夜神模拟器

电脑传模拟器文件方法&#xff1a;方法一&#xff1a;直接拖拽电脑中任意文件到模拟器主界面中&#xff0c;即可跳出如图所示&#xff1a;例&#xff1a;点击移动后变蓝色的窗口按钮直接点击打开手机文件夹按钮&#xff0c;在文件夹内安装或移动即可&#xff1b;方法二&#xf…

[jQuery] jQuery的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

[jQuery] jQuery的属性拷贝(extend)的实现原理是什么&#xff0c;如何实现深拷贝&#xff1f; 一、jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象。 语法$.extend( target [, object1 ] [, objectN ] )指示是否深度合并$.extend( [deep ], target, object1 […

如何在VSTFS中设置email notification

登录Team foundation server,然后Team->Project Alerts, 设置接收通知的email地址即可转载于:https://www.cnblogs.com/magicdlf/archive/2008/02/25/1080962.html

html第一个子元素选择,css选中父元素下的第一个子元素(:first-child)

前言最近在项目中用到 :first-child 很容易的就想到了&#xff0c;嗯嗯。这不就是选择第一个元素吗&#xff1f;好像很好用&#xff0c;平时使用中也没有遇到什么问题&#xff0c;理所当然的就以为它只会选中父元素下的第一个元素&#xff0c;对孙元素和曾孙元素没有影响。事实…

[jQuery] jquery.extend与jquery.fn.extend的区别?

[jQuery] jquery.extend与jquery.fn.extend的区别&#xff1f; 1、认识jQuery extend()和jQuery.fn.extend()jQuery的API手册中&#xff0c;extend方法挂载在jQuery和jQuery.fn两个不同对象上方法&#xff0c;但在jQuery内部代码实现的是相同的&#xff0c;只是功能却不太一样&…

登录按钮的美化

<input type"submit" value"注册"> input[typesubmit]{width: 60px;height: 30px;/*边框*/border: 2px solid #1B47A4;/*圆角*/border-radius: 10px;/*背景渐变*/background: -moz-linear-gradient(top, #2564EE, #225CD2);background: -webkit-line…

Papervision3D 系列教程、学习资源.

来自&#xff1a;http://www.mmug.com.tw/forum官網 http://www.papervision3d.org/ http://blog.papervision3d.org/ http://wiki.papervision3d.org/ http://www.nabble.com/Papervision3D-f22855.html http://osflash.org/mailman/listinfo/Pap ... sflash.org 若是有朋友也…

html表格背景图片格式,HTML表格标记教程(8):背景图像属性BACKGROUND

HTML表格标记教程(8):背景图像属性BACKGROUND互联网 发布时间&#xff1a;2008-10-17 18:56:21 作者&#xff1a;佚名 我要评论为表格设置背景图像&#xff0c;可以使用任何的GIF或者JPEG图片文件。基本语法语法解释定义背景图象时&#xff0c;写下图片文件的完整路径或…

Windows安装zookeeper 单机版

首先需要安装JdK&#xff0c;从Oracle的Java网站下载&#xff0c;安装很简单&#xff0c;就不再详述。 1、下载zookeeper&#xff0c; https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/ 2、&#xff08;单机模式&#xff09;单机安装非常简单&#xf…

[jQuery] jQuery的队列是如何实现的?队列可以用在哪些地方?

[jQuery] jQuery的队列是如何实现的&#xff1f;队列可以用在哪些地方&#xff1f; 一、队列是什么&#xff1f;队列是一种数据结构&#xff0c;跟生活中的排队是一样的,符合先进先出,后进后出的原则即:对一个数组做一些限制&#xff1a;1、只允许在后面插入数据,只允许在前面…

大学生如何成功就业。

面对中国教育体制中大学生的不断扩招&#xff0c;这几年大学生的就业形式越来越严峻。本科生、硕士生已不稀奇&#xff0c;“海归”也成了“海带”&#xff0c;那些学历不高的大专生、中专生更是成了职场中的蓝领一列。那么&#xff0c;大学生如何能在竞争激烈的就业环境中&…

html自定义滚动条不占位,如何实现滚动条在各浏览器中不占用布局

在一般浏览器中&#xff0c;当内容超出容器时&#xff0c;如果不是overflow:hidden&#xff0c;通常都会出现滚动条&#xff0c;由于滚动条并不是浮在布局内容之上&#xff0c;所以通常会带来两个问题&#xff1a;1&#xff0c;容器内部内容宽度固定&#xff0c;恰好撑满&#…

安装教程-VMware 12 安装 Windows 10 企业版

VMware 12 安装 Windows 10 企业版 1、实验描述 在虚拟机中&#xff0c;手动安装 Windows10 企业版操作系统&#xff0c;为一些实验提供平台&#xff0c;因此&#xff0c;有关系统激活问题不再演示。可自行百度&#xff0c;或者加入QQ群交流&#xff1a;647033350 2、实验环境 …

[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?

[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别&#xff1f; 在我们深入了解这些方法之前&#xff0c;我们先来一段常见的的HTML&#xff0c;作为我们编写jquery示例方法使用的样本。<ul id"members" data-role"listview" data-filter…

地贝扫地机器人维修_扫地机器人常见故障及维修方法

扫地机器人虽然智能&#xff0c;但是毕竟是人造机器&#xff0c;在使用很长时间后&#xff0c;多多少少会出现一些小问题。今天小编给大家分享下扫地机器人常见故障及维修方法&#xff0c;可供参考。扫地机器人常见故障及维修方法一、开机毫无反应对于小白的许多用户来说&#…

VSS 详解

VSS概述版本控制是工作组软件开发中的重要方面&#xff0c;它能防止意外的文件丢失、允许反追踪到早期版本、并能对版本进行分支、合并和管理。在软件开发和您需要比较两种版本的文件或找回早期版本的文件时&#xff0c;源代码的控制是非常有用的。Visual SourceSafe 是一种源代…

html生成1-32位随机数,如何生成一个32位的随机数 | 求索阁

CStringA CreateHex(int max){CStringA precision;precision.Format("%x",max);int size precision.GetLength();int num_align size%4; // 按多少位对齐if(num_align <4)num_align 4;else if (num_align <8) // 这里我假设最大数32位,如果…