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

AndroidViewPager无限循环滑动并可自动滚动完整实例

对于AndroidViewPager广告页可无限循环滑动并可自动滚动带有小圆点的这个功能很多APP都有这个功能,这里为大家提供了完整的实例代码

对于ViewPager 广告页这个功能很多APP都有这个功能在网上也看过一些资料,我就在这把我自己完整的实现方法写出来吧

基础的ViewPager:

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


    



很简单 仅仅是一个ViewPager

接下来简单的设置一下ViewPager的Adapter 添加ImageView

public class MainActivity extends AppCompatActivity {

  private ViewPager topVp;
  private int[]images = new int[]{R.mipmap.ad0, R.mipmap.ad1, R.mipmap.ad3}; //模拟存放要展示的图片
  private List imageViews ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initImageViews();
    initVp();
  }

  /**
   * 初始化图片资源
   */
  private void initImageViews() {
    imageViews = new ArrayList<>();
    for(int i = 0;i

上述是最基础的一个ViewPager 下面我们就在这个基础上改造就可以了

实现无限循环滑动:

这里我事先循环滑动的方式很简单 就是把 adapter的count 设置为一个很大的值 这样 让它滑不到头 然后切换图片 就可以实现 虽然方法比较LOW 但是效果还是可以的

代码在基础的ViewPager下修改如下 :

public class MainActivity extends AppCompatActivity {

  private ViewPager topVp;
  private int[]images = new int[]{R.mipmap.ad0, R.mipmap.ad1, R.mipmap.ad3}; //模拟存放要展示的图片
  private List imageViews ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initImageViews();
    initVp();
  }

  /**
   * 初始化图片资源
   */
  private void initImageViews() {
    imageViews = new ArrayList<>();
    for(int i = 0;i

这样 之后就可以实现无限循环右滑了 但是在程序刚启动 是 无法向左滑动的 要解决 很简单 只需要在开始的时候

viewPager.setCurrentItem(1000*imageViews.size());

即可 这样 就可以 实现 无限左右滑了

自动定时循环滑动:

下面增加自动定时左右滑动的功能

要实现自动滑动 最主要的是 实现定时器功能我这里使用 Handler+Runnable的方法在上述代码的基础上 修改 如下:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initImageViews();
    initVp();
    handler = new Handler();
    handler.postDelayed(new TimerRunnable(),5000);
  }

  class TimerRunnable implements Runnable{

    @Override
    public void run() {
      int curItem = topVp.getCurrentItem();
      topVp.setCurrentItem(curItem+1);
      if (handler!=null){
        handler.postDelayed(this,5000);
      }
    }
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    handler = null; //此处在Activity退出时及时 回收
  }

这之后 就可以实现自动滑动了

添加左下角圆形小按钮:

接下来添加 左下角的导航小原点

首先 修改布局 :

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

  


    
    

    
  




我们需要的原点 要放在 LinearLayout布局中

主要原理 就是向这个LinearLayout中动态添加 小圆点 即可

public class MainActivity extends AppCompatActivity {

  private ViewPager topVp;
  private int[]images = new int[]{R.mipmap.ad0, R.mipmap.ad1, R.mipmap.ad3}; //模拟存放要展示的图片
  private List imageViews ;
  private List txtPoints;
  private LinearLayout lin_points;
  private Handler handler;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lin_points = (LinearLayout) findViewById(R.id.lin_points);
    initImageViews();
    initVp();

    initCircle();
    /*
     * 计时器
     */
    handler = new Handler();
    handler.postDelayed(new TimerRunnable(),5000);
  }

  /**
   * 初始化小圆点
   */
  private void initCircle() {
    txtPoints = new ArrayList<>();
    int d = 20;
    int m = 7;
    for (int i = 0; i ();
    for(int i = 0;i

给ViewPager添加切换动画:

topVp.setPageTransformer(true,new CubeOutTransformer());

调用 此行代码 可以添加 后面的TransFormer类 是自定义的过渡效果类

控制ViewPager 自动切换的速度

ViewPager自身的切换速度是写死的,我们无法修改,但是我们可以通过源码看到,ViewPager的切换速度是通过 Scroller类 控制的,而Scroller类中是可以设置过渡的时间的,因此 我们可以通过自己创建一个Scroller类 继承 Scroller 然后 通过反射 把ViewPager中的mScroller属性 设置成我们自己的可以设置时间的Scroller类即可

下面是代码:

public class FixedSpeedScroller extends Scroller {
  private int mDuration = 1500;

  public FixedSpeedScroller(Context context) {
    super(context);
  }

  public FixedSpeedScroller(Context context, Interpolator interpolator) {
    super(context, interpolator);
  }

  @Override
  public void startScroll(int startX, int startY, int dx, int dy, int duration) {
    // Ignore received duration, use fixed one instead
    super.startScroll(startX, startY, dx, dy, mDuration);
  }

  @Override
  public void startScroll(int startX, int startY, int dx, int dy) {
    // Ignore received duration, use fixed one instead
    super.startScroll(startX, startY, dx, dy, mDuration);
  }

  public void setmDuration(int time) {
    mDuration = time;
  }

  public int getmDuration() {
    return mDuration;
  }
}

反射修改ViewPager属性:

 try {
      Field field = ViewPager.class.getDeclaredField("mScroller");
      field.setAccessible(true);
      scroller = new FixedSpeedScroller(getActivity());
      scroller.setmDuration(1000);
      field.set(topVp, scroller);
    } catch (Exception e) {
//      e.printStackTrace();
      System.out.println("aaaaaa错误啦");
    }

这样就可以控制速度了

好了,Android ViewPager广告页可无限循环滑动并可自动滚动带有小圆点的功能基本就实现了,具体参数大家可以自行设定


推荐阅读
  • 在 Android 应用开发中,实现全屏模式和无标题栏设计是提升用户体验的重要手段。本文详细介绍了如何通过 Java 代码实现取消标题栏 `this.requestWindowFeature(Window.FEATURE_NO_TITLE)`,并进一步探讨了全屏模式的多种实现方法和最佳实践,帮助开发者打造更加沉浸式和美观的用户界面。 ... [详细]
  • 在Android开发中,BroadcastReceiver(广播接收器)是一个重要的组件,广泛应用于多种场景。本文将深入解析BroadcastReceiver的工作原理、应用场景及其具体实现方法,帮助开发者更好地理解和使用这一组件。通过实例分析,文章详细探讨了静态广播的注册方式、生命周期管理以及常见问题的解决策略,为开发者提供全面的技术指导。 ... [详细]
  • 推荐一款出色的移动应用原型设计工具——Tiggr(http://gotiggr.com)。该工具基于Flash技术开发,支持Web、iPhone和Android等多种平台的原型设计。虽然需要注册账号才能使用,但其强大的功能和易用性使其成为开发者和设计师的理想选择。 ... [详细]
  • 将解压缩版Tomcat集成至系统服务
    将解压缩版Tomcat集成至系统服务的方法如下:首先,在命令行中导航至Tomcat的`bin`目录,运行`service.bat install`命令以安装服务。需要注意的是,服务名称和显示名称已在`service.bat`脚本中预设,默认情况下会随不同版本有所变化。此外,建议检查并配置相关参数,确保服务能够稳定运行。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 题目探讨了在无向图中求解点连通数的问题,具体涉及UVA1660和POJ1966两个经典问题。通过最小割算法的应用,分析了如何高效地确定网络中的关键节点和路径,为电缆电视网络的优化设计提供了理论支持。该研究不仅验证了最小割算法的有效性,还为进一步探索复杂网络的连通性和鲁棒性奠定了基础。 ... [详细]
  • 在 POJ1651 的乘法谜题挑战中,如果选手按相反顺序选择卡片,即先选 50,再选 20,最后选 1,则最终得分会有所不同。题目要求输入的第一行包含... 改写后的摘要:在 POJ1651 的乘法谜题挑战中,如果选手按照逆序选取卡片,例如依次选择 50、20 和 1,最终的得分将发生变化。题目首先要求输入的第一行包括... ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • AngularJS 进阶指南:第三部分深入解析
    在本文中,我们将深入探讨 AngularJS 的指令模型,特别是 `ng-model` 指令。`ng-model` 指令用于将 HTML 元素与应用程序数据进行双向绑定,支持多种数据类型验证,如数字、电子邮件地址和必填项检查。此外,我们还将介绍如何利用该指令优化表单验证和数据处理流程,提升开发效率和用户体验。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
author-avatar
妮子爱笨蛋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有