android画廊无限轮播,ViewPager无限循环实现画廊式banner
先看一下效果
两边显示上一个和下一个item部分布局,可以自动滚动
实现:
布局
主要属性:android:clipChildren="false" //允许子布局超出父布局显示
xml代码:
Adapter
没什么特别的只要 getCount()返回一个很大的值如:return Integer.MAX_VALUE;
适配器代码:
package com.guzhc.module_demo;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.List;
/**
* @author : GuZhC
* @date : 2019/6/1 9:46
* @description : 顶部banner viewPager 适配器
*/
public class ShortViewoViewPagerAdapter extends PagerAdapter {
private final Context context;
private final ListmData;
private PagerClick pagerClick;
public ShortViewoViewPagerAdapter(ListmData, Context context) {
this.mData = mData;
this.context = context;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
//Warning:不要在这里调用removeView
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position %= mData.size();
final String data = mData.get(position);
View view = View.inflate(container.getContext(),R.layout.demo_item_short_video_viewpager, null);
ImageView img = view.findViewById(R.id.demo_img_short_video_item);
TextView tvContent = view.findViewById(R.id.demo_tv_short_video_item);
tvContent.setText(data);
Glide.with(context)
.load("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1559367407524&di=2a7d6a1a12707287e908d61922a637c2&imgtype=0&src=http%3A%2F%2Fpic72.nipic.com%2Ffile%2F20150715%2F9448607_192612583000_2.jpg")
.into(img);
//对ViewPager页号求模取出View列表中要显示的项
if (position < 0) {
position = mData.size() + position;
}
//如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。
ViewParent vp = view.getParent();
if (vp != null) {
ViewGroup parent = (ViewGroup) vp;
parent.removeView(view);
}
container.addView(view);
return view;
}
}
调用
注意:两边的item滑动没有效果吗,需要将容器的触摸事件反馈给ViewPager
//设置banner
shortViewoViewPagerAdapter = new ShortViewoViewPagerAdapter(mData, getContext());
View bannerView = LayoutInflater.from(getContext()).inflate(R.layout.demo_layout_short_video_banner, null);
viewPagerBanner = bannerView.findViewById(R.id.demo_vp_short_video_top);
LinearLayout mViewPagerContainer = bannerView.findViewById(R.id.demo_ll_short_video_vp_root);
viewPagerBanner.setAdapter(shortViewoViewPagerAdapter);
viewPagerBanner.addOnPageChangeListener(this);
//将容器的触摸事件反馈给ViewPager
mViewPagerContainer.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return viewPagerBanner.dispatchTouchEvent(event);
}
});
无限循环:方式很多,这里用的Handler实现
设置viewPager.addOnPageChangeListener(this)实现接口重写方法:实现滑动时候暂停自动滑动,停止的时候开启
重写方法代码:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
handler.sendMessage(Message.obtain(handler, ImageHandler.MSG_PAGE_CHANGED, position, 0));
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
//滑动中
case ViewPager.SCROLL_STATE_DRAGGING:
handler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
break;
//未滑动
case ViewPager.SCROLL_STATE_IDLE:
handler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
break;
default:
break;
}
}
Handler代码:
public class ImageHandler extends Handler {
/**
* 请求更新显示的View。
*/
protected static final int MSG_UPDATE_IMAGE = 1;
/**
* 请求暂停轮播。
*/
protected static final int MSG_KEEP_SILENT = 2;
/**
* 请求恢复轮播。
*/
protected static final int MSG_BREAK_SILENT = 3;
/**
* 记录最新的页号,当用户手动滑动时需要记录新页号,否则会使轮播的页面出错。
* 例如当前如果在第一页,本来准备播放的是第二页,而这时候用户滑动到了末页,
* 则应该播放的是第一页,如果继续按照原来的第二页播放,则逻辑上有问题。
*/
protected static final int MSG_PAGE_CHANGED = 4;
//轮播间隔时间
protected static final long MSG_DELAY = 5000;
//使用弱引用避免Handler泄露.
private WeakReferenceweakReference;
private int currentItem = 0;
protected ImageHandler(WeakReferencewk){
weakReference = wk;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ShortVedioFragmet shortVedioFragmet = weakReference.get();
if (shortVedioFragmet==null){
//Activity已经回收,无需再处理UI了
return ;
}
//检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。
if (shortVedioFragmet.handler.hasMessages(MSG_UPDATE_IMAGE)){
shortVedioFragmet.handler.removeMessages(MSG_UPDATE_IMAGE);
}
switch (msg.what) {
case MSG_UPDATE_IMAGE:
currentItem++;
shortVedioFragmet.viewPagerBanner.setCurrentItem(currentItem);
//准备下次播放
shortVedioFragmet.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
break;
case MSG_KEEP_SILENT:
//只要不发送消息就暂停了
break;
case MSG_BREAK_SILENT:
shortVedioFragmet.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
break;
case MSG_PAGE_CHANGED:
//记录当前的页号,避免播放的时候页面显示不正确。
currentItem = msg.arg1;
break;
default:
break;
}
}
}
如果是viewpager嵌套Fragment的界面中使用可以通过setUserVisibleHint(boolean isVisibleToUser)方法这样开启和暂停:
setUserVisibleHint()方法会在fragment显示和隐藏的时候被调用
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
//相当于OnResume(),可以做相关逻辑
//开始轮播效果
handler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
}else {
//相当于OnPause()
//暂停轮播效果
handler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
}
}
在Activity使用 可以在onResum() 和onPause()开启可暂停。
至此完成。
android画廊无限轮播,ViewPager无限循环实现画廊式banner相关推荐
- android ViewPager实现无限轮播和设置监听事件
ViewPager的无限轮播,主要以实现为主.代码如下 首先定义activity_viewpager.xml: <LinearLayout android:layout_width=" ...
- android画廊效果的轮播图,ViewPage实现无限轮播画廊效果
1. 效果图 2. 布局文件 主要使用的 android:clipChildren的意思:是否限制子View在其范围内.再父布局和viewpager中设置该属性 ,要显示三个界面 ,还要设置marg ...
- android viewpager无限轮播
概述 github地址:https://github.com/Double2hao/ViewPagerCycleTest 一直很好奇ViewPager无限轮播的实现方式,于是稍微研究了下,作此文记录之 ...
- ViewPager两种方式实现无限轮播
给自己的忠告:虽然轮子很好用,但是使用轮子的前提是:如果不去封装一些复杂的功能,自己会用最基本的方法写一个,不然再好的轮子那也是别人的,当自己项目遇到和轮子不一样的地方,那就只能束手无策或者改人家的源 ...
- Android多效果轮播器/Banner实现,支持无限轮播、自动切换、指示器动画
2019.9.12 已封装成控件扔到GitHub上https://github.com/kjt666/Banner 开篇 接上篇文章动手实现你的ViewPager切换动画 本次内容是利用ViewPag ...
- Android实现广告页图片无限轮播
一.概述 对于一个联网的Android应用, 首页广告无限轮播基本已经成为标配了. 那么它是怎么实现的呢? 有几种实现方式呢? 二.无限轮播的实现 1.最常规的手段是用 ViewPager来实现 2. ...
- android 轮换实现动画,怎么在Android中实现一个首页无限轮播功能
怎么在Android中实现一个首页无限轮播功能 发布时间:2021-04-12 16:22:49 来源:亿速云 阅读:74 作者:Leah 这期内容当中小编将会给大家带来有关怎么在Android中实现 ...
- XLisetView+ViewPager无限轮播+多条目加载
导xlistview jar包 权限 //主布局 <?xml version="1.0" encoding="utf-8"?> <Linear ...
- ViewPager无限轮播与小点点
在Android开发中经常简单会用到 ViewPager无限轮播与小点点,下面就简单介绍一下,其中的小点点可以找美工绘制,Android工程师也可以自己手动简易制作 定义XML布局文件 <Rel ...
- 引导界面滑动导航 + 大于等于1页时无限轮播 + 各种切换动画轮播效果
参考地址: https://github.com/bingoogolapple/BGABanner-Android#%E6%95%88%E6%9E%9C%E5%9B%BE%E4%B8%8E%E7%A4 ...
最新文章
- 数字图像处理基础知识之二
- 让TP5.0在SWOOLE上飞起来
- 讲解虚拟服务器的书_程序员不得不看的书
- codeforces 361 D. Levko and Array(dp+二分)
- JAVA包装类及自动封包解包示例代码
- Mysql 分组聚合实现 over partition by 功能
- php点击表格单元格链接,详解PhpSpreadsheet单元格设置样式、图片、超链接等
- C#|通过webBrowser控件实现与html间的相互传值
- Ubuntu系统最简GCC安装方法
- 英文版 office 中的中文字体
- 深度学习面试题:计算机视觉训练技巧
- es搜索同义词近义词技术方案
- php中fastcgi和php-fpm是什么
- 计算机显示器模糊,显示器模糊,我来教您电脑显示器模糊怎么办
- 程序员键盘使用进阶技巧
- excel怎么设置自动计算_中建整理:160个Excel自动计算表,计算快效率高数据精准,超实用...
- 快门背后的机器学习:实时 HDR+ 和双重曝光控制
- 在vue 中 ,dom操作滚动条 scrollTop无效
- Linux du按大小排序
- 最常用的26句生活用语
热门文章
- html标签设计视频音量,如何在HTML5视频标签只添加音量控制
- 谷歌Debugger调试
- indesign安装包.exe 自动简繁互转for_InDesign 简繁互换插件
- 矩阵变换应用-分块矩阵
- 立秋后注意脚部保暖 试试量身定制合脚鞋
- 分享6种时间管理方法,不要再说时间不够用了!
- ds90ub934 i2c 配置_DS90UB934-Q1 25MHz 至 100MHz 10/12 位 FPD-Link III 串行器和解串器
- 普加.大学生广告创意大赛公告
- EOJ 2706 Fenwick Tree 树状数组找规律
- OpenGL (太阳,地球,月亮 +太阳系八大行星)