热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android完美实现平滑过渡的ViewPager广告条

这篇文章主要为大家详细介绍了Android完美实现平滑过渡的ViewPager广告条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

我们经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环的效果。看到那样的效果,相信大家都会想到ViewPager,但是ViewPager并不支持循环翻页,所以要实现循环还得需要自己去动手。最后还有一个问题就是翻页到最后一页如何平滑过渡到首页的问题。这些都源于有人私信问我ViewPager广告条如何平滑过渡的问题,出于这个问题,我想着亲自实现并分享下吧,本篇就是为了解决这些问题而写的。

1.初始化布局

我们先来写一个ViewPager广告条的布局:


 
 
  
  
  
 


此时的效果如下,是不是已经有了点模样:

2.Activity实现

接下来进入到关键的实现代码,当然,Activity实现也难不倒我们,其中ViewPager数据,为了方便,本篇就直接用本地数据进行模拟了。而在实际项目开发数据大都来自网络。

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {

 private List vpLists;
 private LinearLayout ll_dot_group; //用来添加小圆点
 private String[] imageDescArrs;
 private TextView tv_img_desc;
 private ViewPager vp;

 private boolean isSwitchPager = false; //默认不切换
 private int previousPosition = 0; //默认为0

 private Handler handler = new Handler() {
  public void handleMessage(android.os.Message msg) {
   //更新当前viewpager的 要显示的当前条目
   vp.setCurrentItem(vp.getCurrentItem() + 1);
  }
 };

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initView();
 }

 /**
  * 初始化view
  */
 private void initView() {
  vp = (ViewPager) findViewById(R.id.vp);
  ll_dot_group = (LinearLayout) findViewById(R.id.ll_dot_group);
  tv_img_desc = (TextView) findViewById(R.id.tv_img_desc);

  initViewPagerData();
  vp.setAdapter(new ViewpagerAdapter());

  //设置当前viewpager要显示第几个条目
  int item = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2 % vpLists.size());
  vp.setCurrentItem(item);

  //把第一个小圆点设置为白色,显示第一个textview内容
  ll_dot_group.getChildAt(previousPosition).setEnabled(true);
  tv_img_desc.setText(imageDescArrs[previousPosition]);
  //设置viewpager滑动的监听事件
  vp.addOnPageChangeListener(this);

  //实现自动切换的功能
  new Thread() {
   public void run() {
    while (!isSwitchPager) {
     SystemClock.sleep(3000);
     //拿着我们创建的handler 发消息
     handler.sendEmptyMessage(0);
    }
   }
  }.start();
 }

 /**
  * 初始化ViewPager的数据
  */
 private void initViewPagerData() {
  imageDescArrs = new String[]{"标题1", "标题2", "标题3", "标题4", "标题5"};
  vpLists = new ArrayList();
  int imgIds[] = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e};
  ImageView iv;
  View dotView;

  for (int i = 0; i 

如上我们就解决了平滑过渡的问题,关键的地方就是ViewpagerAdapter:

getCount方法我们返回Integer.MAX_VALUE

public int getCount() {
 return Integer.MAX_VALUE;
}

初始化每个条目要显示的内容,我们拿着position位置 % 集合.size

@Override
public Object instantiateItem(ViewGroup container, int position) {
 //拿着position位置 % 集合.size
 int newposition = position % vpLists.size();
 //获取到条目要显示的内容imageview
 ImageView iv = vpLists.get(newposition);
 //要把 iv加入到 container 中
 container.addView(iv);
 return iv;
}

此时我们发现已经最后一个广告可以平滑过渡了,但是还有一个问题就是,那从第一张开始,我们往左滑呢?其实也很容易解决,就是设置第一个条目为Integer.MAX_VALUE的中间位置就可以了,我们来到initView方法中,设置当前viewpager要显示第几个条目:

int item = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2 % vpLists.size());
vp.setCurrentItem(item);

问题完美解决。

用到的Shape相关资源如下:

selector_dot.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
 


dot_enable.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
 


dot_normal.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
 


来看看效果图:

到此,一个平滑过渡的ViewPager广告条已经完美实现了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • A*算法在AI路径规划中的应用
    路径规划算法用于在地图上找到从起点到终点的最佳路径,特别是在存在障碍物的情况下。A*算法是一种高效且广泛使用的路径规划算法,适用于静态和动态环境。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • MySQL 数据库连接方法
    本文介绍了如何使用 MySQL 命令行工具连接到指定的数据库。 ... [详细]
  • 在 Mac 上配置 NDK
    本文详细介绍了如何在 Mac 上配置 Android NDK,包括设置环境变量和解决常见问题的方法。 ... [详细]
  • 如何解决8080端口被占用问题
    本文介绍了如何通过命令行和任务管理器查找并终止占用8080端口的进程,以确保该端口能够正常使用。 ... [详细]
  • Excel 数据分析基础
    Excel 是数据分析中最基本且强大的工具之一,具备多种实用功能和操作方法。本文将简要介绍 Excel 的不同版本及其兼容性问题,并探讨在处理大数据时的替代方案。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文详细介绍了 Charles 工具的下载、安装、配置及使用方法,特别针对 HTTP 和 HTTPS 协议的数据抓取进行了说明。 ... [详细]
author-avatar
leee
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有