当前位置: 移动技术网 > 移动技术>移动开发>Android > Android动态给ViewPager添加Indicator导航

Android动态给ViewPager添加Indicator导航

2019年07月24日  | 移动技术网移动技术  | 我要评论

先看下效果

小圆点的形状和颜色都是可以自己定义的,看需求

首先第一步,滑2个圆点,一个是选中后的圆点,一个是未选中的圆点,看选中的圆点shape

<?xml version="1.0" encoding="utf-8"?>
<shape
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="oval"
  >
  <solid android:color="@color/colorprimary"/>

</shape>

未选中的

<?xml version="1.0" encoding="utf-8"?>
<shape
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="oval"
  >
  <solid android:color="@color/coloraccent"/>

</shape>

是不是很简单,就指定一个圆形,一个颜色

接下来就是定义一个selector,用来控制选中和非选中

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:drawable="@drawable/indicator_checked_shape" android:state_enabled="true"/>
  <item android:drawable="@drawable/indicator_unchecked_shape" android:state_enabled="false"/>
</selector>

然后就是mainactivity的布局文件,放置一个viewpager,下面放置一个linearlayout,用来装小圆点

<?xml version="1.0" encoding="utf-8"?>
<relativelayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.duanlian.viewpagerindicatordemo.mainactivity">

  <android.support.v4.view.viewpager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="170dp"
    />

  <linearlayout
    android:id="@+id/linear"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_below="@+id/viewpager"
    android:layout_margintop="-40dp"
    android:gravity="center"
    android:orientation="horizontal"></linearlayout>
</relativelayout>

接下来就是mainactivity的代码,其实很简单,都有注释,就不细说了

package com.duanlian.viewpagerindicatordemo;

import android.os.bundle;
import android.support.v4.view.viewpager;
import android.support.v7.app.appcompatactivity;
import android.widget.imageview;
import android.widget.linearlayout;

import java.util.arraylist;
import java.util.list;

public class mainactivity extends appcompatactivity {
  private viewpager mviewpager;
  private linearlayout mlinear;
  private list<imageview> mlist;
  private pageradapter mpageradapter;
  private int[] imagearray = {r.mipmap.banner1, r.mipmap.banner2, r.mipmap.banner3, r.mipmap.ic_launcher};

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    initview();
    initpoint();
  }

  private void initview() {
    mviewpager = (viewpager) findviewbyid(r.id.viewpager);
    mlinear = (linearlayout) findviewbyid(r.id.linear);
    //给viewpager添加图片显示
    mlist = new arraylist<>();
    for (int i = 0; i < imagearray.length; i++) {
      imageview imageview = new imageview(this);
      imageview.setimageresource(imagearray[i]);
      mlist.add(imageview);
    }
    mpageradapter = new pageradapter(mlist);
    mviewpager.setadapter(mpageradapter);
    //viewpager切换的监听事件
    mviewpager.addonpagechangelistener(new viewpager.onpagechangelistener() {
      @override
      public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) {
        position = position % mlist.size();// 需要对position的值进行重新赋值,否则会造成数组越界
        // 更新小圆点的显示
        for (int i = 0; i < mlist.size(); i++) {
          imageview iv = (imageview) mlinear.getchildat(i);
          // 当前滑到的是那一页就让第几个小圆点处于选中状态
          if (position == i) {
            iv.setenabled(true);
          } else {
            iv.setenabled(false);
          }
        }
      }

      @override
      public void onpageselected(int position) {

      }

      @override
      public void onpagescrollstatechanged(int state) {

      }
    });
  }

  /**
   * 初始化指示器
   */
  private void initpoint() {
    for (int i = 0; i < mlist.size(); i++) {
      // 往llcontainer添加一个小圆点
      imageview iv = new imageview(this);
      //设置背景
      iv.setimageresource(r.drawable.indicator_viewpager_selector);
      //设置原点大小
      linearlayout.layoutparams params = new linearlayout.layoutparams(30, 30);
      //如果是切好的图片就直接自适应
//      linearlayout.layoutparams params = new linearlayout.layoutparams(viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content);
      iv.setlayoutparams(params);
      // 默认第0个小圆点显示红色
      if (i == 0) {
        iv.setenabled(true);
      } else {
        iv.setenabled(false);
      }
      //设置原点之间的间距
      iv.setpadding(5, 5, 5, 5);
      //添加到linearlayout中
      mlinear.addview(iv);
    }
  }
}

最后附上viewpager的adapter

package com.duanlian.viewpagerindicatordemo;


import android.view.view;
import android.view.viewgroup;
import android.widget.imageview;

import java.util.list;

/**
 * viewpager的adapter
 */

public class pageradapter extends android.support.v4.view.pageradapter{
  private list<imageview> list;

  public pageradapter(list<imageview> list) {
    this.list = list;
  }

  @override
  public int getcount() {
    return list.size();
  }

  @override
  public boolean isviewfromobject(view view, object object) {
    return view==object;
  }
  @override
  public object instantiateitem(viewgroup container, int position) {
    container.addview(list.get(position));//添加页卡
    return list.get(position);
  }

  @override
  public void destroyitem(viewgroup container, int position, object object) {
    container.removeview(list.get(position));//删除页卡
  }
}


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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网