android画廊无限轮播,ViewPager无限循环实现画廊式banner

android画廊无限轮播,ViewPager无限循环实现画廊式banner先看一下效果两边显示上一个和下一个item部分布局,可以自动滚动实现:布局主要属性:android:clipChildren=”false”//允许子布局超出父布局显示xml代码:Adapter没什么特别的只要getCount()返回一个很大的值如:returnInteger.MAX_VALUE;适配器代码:packagecom.guzhc.module_demo;importandr…

大家好,又见面了,我是你们的朋友全栈君。

先看一下效果

02137c01d3494d157819fc344857c68a.png

两边显示上一个和下一个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()开启可暂停。

至此完成。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129964.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 51单片机流水灯电路以及C代码「建议收藏」

    51单片机流水灯电路以及C代码「建议收藏」流水灯是51单片机的入门级实验,以下是其电路图以及C代码流水灯proteus电路图此图发光二极管采用共阳极式连接流水灯C代码#include&amp;amp;amp;amp;amp;amp;amp;amp;lt;reg51.h&amp;amp;amp;amp;amp;amp;amp;amp;gt;voiddelay1s(unsignedcharn);voidMovinglight(){ unsignedcharcodeMovinglightA

    2022年5月3日
    61
  • batch spring 重复执行_Spring Batch批处理

    batch spring 重复执行_Spring Batch批处理SpringBatch批处理批处理顾名思义是批量处理大量数据,但是这个大量数据又不是特别大的大数据,比Hadoop等要轻量得多,适合企业单位人数薪资计算,财务系统月底一次性结算等常规数据批量处理。SpringBatch是一个用于创建健壮的批处理应用程序的完整框架。您可以创建可重用的函数来处理大量数据或任务,通常称为批量处理。如SpringBatch文档中所述,使用该框架的最常见方案如下:•定…

    2022年5月28日
    55
  • 数仓拉链表[通俗易懂]

    数仓拉链表[通俗易懂]拉链表一丶什么是拉链表拉链表是一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式。百度百科的解释:拉链表是维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的客户记录。二丶拉链表的产生背景在数据仓库的

    2022年10月16日
    5
  • Android严苛模式StrictMode使用详解[通俗易懂]

    Android严苛模式StrictMode使用详解[通俗易懂]StrictMode类是Android 2.3(API9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线

    2022年7月3日
    23
  • Linux 连接memcache 拒绝连接,防火墙关闭,selinux disabled 仍然不行,最后在外站找到原因,为服务器添加memcache访问权限…[通俗易懂]

    Linux 连接memcache 拒绝连接,防火墙关闭,selinux disabled 仍然不行,最后在外站找到原因,为服务器添加memcache访问权限…

    2022年2月8日
    42
  • Emgucv环境配置[通俗易懂]

        Emgucv是在.NET平台下使用OpenCV视觉库的桥梁,在使用之前需要对系统进行配置,其配置和OpenCV的配置有点不同。1、EmguCV下载下载网站:http://www.emgu.com/wiki/index.php/Main_Page该网站上有EmguCV的所有资料,包括教程。下载好之后,直接安装到电脑上,安装位置可任意。本文所配置的是EmguCV3.0.0版本。2、新建一个VS…

    2022年4月14日
    86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号