Android ViewPager无限循环实现底部小圆点动态滑动

页面拖动到最后一页 再向下滑动回复到 第一页,第一页向前滑动回到 最后一页

同时,底部红色小圆点随着页面的滑动距离比例随时改变位置

布局:

<?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:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.lian.viewpagertest.MainActivity"> 

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

  <TextView
    android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="内容"
    android:textSize="25sp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    /> 

  <RelativeLayout
    android:id="@+id/rl_bottom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="45dip" > 

    <LinearLayout
      android:id="@+id/ll_points"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:orientation="horizontal" >
    </LinearLayout> 

    <View
      android:id="@+id/v_redpoint"
      android:layout_width="10dip"
      android:layout_height="10dip"
      android:background="@drawable/red_circle" />
  </RelativeLayout>
</RelativeLayout>

其中red_circle是用shape绘制的红色小圆点

最后的LinearLayout实际上是灰色小圆点的容器,在代码中根据数据的长度动态确定数目

代码:

package com.lian.viewpagertest; 

import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView; 

import java.util.ArrayList;
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

  private ViewPager mViewPager;
  private TextView mTextView;
  private LinearLayout mLinearLayout;
  private View mView;
  private List<ImageView> mDataList;
  private int diatance; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initView();
    initData();
    initEvent();
  } 

  /**
   * 初始化数据
   */ 

  private void initData() {
    int[] sorce = new int[]{R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e}; 

    mDataList = new ArrayList<ImageView>(); 

    for (int i = 0;i < sorce.length;i ++){
      ImageView img = new ImageView(getApplicationContext());
      img.setImageResource(sorce[i]);
      mDataList.add(img); 

      //添加底部灰点
      View v = new View(getApplicationContext());
      v.setBackgroundResource(R.drawable.gray_circle);
      //指定其大小
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20,20);
      if (i != 0)
        params.leftMargin = 20;
      v.setLayoutParams(params);
      mLinearLayout.addView(v);
    } 

    mViewPager.setAdapter(new MyAdapter()); 

    //设置每次加载时第一页在MAX_VALUE / 2 - Extra 页,造成用户无限轮播的错觉
    int startPage = Integer.MAX_VALUE / 2;
    int extra = startPage % mDataList.size();
    startPage = startPage - extra;
    mViewPager.setCurrentItem(startPage);
  } 

  /**
   * ViewPager的容器
   */ 

  public class MyAdapter extends PagerAdapter{ 

    @Override
    public int getCount() {
      //告诉容器我们的数据长度为Integer.MAX_VALUE,这样就可以一直滚动
      return Integer.MAX_VALUE;
    } 

    @Override
    public boolean isViewFromObject(View view, Object object) {
      return view == object;
    } 

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      //若position超过mDataList.size(),会发生越界异常,所以这里每次超过size又从0开始计算位置
      position = position % mDataList.size(); 

      ImageView img = mDataList.get(position);
      container.addView(img); 

      return img;
    } 

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) { 

      position = position % mDataList.size(); 

      container.removeView((View)object); 

      // super.destroyItem(container, position, object);
    }
  } 

  private void initEvent() { 

    /**
     * 当底部红色小圆点加载完成时测出两个小灰点的距离,便于计算后面小红点动态移动的距离
     */
    mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        diatance = mLinearLayout.getChildAt(1).getLeft() - mLinearLayout.getChildAt(0).getLeft();
        Log.d("两点间距",diatance + "测出来了");
      }
    }); 

    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
      @Override
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

        //测出页面滚动时小红点移动的距离,并通过setLayoutParams(params)不断更新其位置
        position = position % mDataList.size();
        float leftMargin = diatance * (position + positionOffset);
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mView.getLayoutParams();
        params.leftMargin = Math.round(leftMargin);
        mView.setLayoutParams(params);
        Log.d("红点在这",leftMargin + "");
      } 

      @Override
      public void onPageSelected(int position) { 

      } 

      @Override
      public void onPageScrollStateChanged(int state) { 

      }
    });
  } 

  private void initView() { 

    setContentView(R.layout.activity_main); 

    mViewPager = (ViewPager) findViewById(R.id.viewpager); 

    mTextView = (TextView) findViewById(R.id.tv); 

    mLinearLayout = (LinearLayout) findViewById(R.id.ll_points); 

    mView = findViewById(R.id.v_redpoint);
  }
} 

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

(0)

相关推荐

  • Android App中使用ViewPager+Fragment实现滑动切换效果

    在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android-support-v4.jar.细节无法控制.不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包.那我们就也采用viewpager来做滑动吧.另外一个概念就是Fragment和FragmentActivit

  • Android App中ViewPager所带来的滑动冲突问题解决方法

    叙述 滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三方框架的时候,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了. 关于滑动冲突 滑动冲突分类: 滑动冲突,总的来说就是两类. 1.同方向滑动冲突 比如ScrollView嵌套ListView,或者是ScrollView嵌套自己 2.不同方向滑动冲突 比如ScrollView嵌套ViewPager,或者是ViewPager嵌套ScrollView,这种情况其实很典型.现在大部分应用最外层都是

  • 使用ViewPager实现左右循环滑动及滑动跳转

    前面一篇文章实现了使用ViewPager实现高仿launcher拖动效果 ,后来很多朋友问能不能实现左右循环滑动效果和引导页面.今天实现了左右滑动,至于在最后一页滑动跳转,这个也做了但是效果不是太好,也希望有实现的朋友能够分享下.在最后一页添加一张图片单击跳转,这个认为很简单大家自己添加个图片,点击后跳转就OK. 这篇是在实现了使用ViewPager实现高仿launcher拖动效果的基础上做了一些小的修改,可以参照前面的.废话不多说了,直接上代码吧! 首先看一些layout下的xml 复制代码

  • Android开发之使用ViewPager实现图片左右滑动切换效果

    Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布局都是相同的,如下只展示其中之一: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

  • android配合viewpager实现可滑动的标签栏示例分享

    复制代码 代码如下: package com.example.playtabtest.view; import com.example.playtabtest.R; import android.app.Activity;import android.content.Context;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;impor

  • Android使用ViewPager实现屏幕滑动效果

    使用ViewPager实现屏幕滑动 从一个完整的屏幕移动到另一个屏幕的过程被称为屏幕滑动,在安装向导.幻灯片中应用广泛.下面介绍如何利用Android Support库的ViewPager来实现屏幕滑动. 创建View 创建一个在之后作为fragment的内容的布局文件,下面的例子中包含一个Textview,用来展示一些文字. <!-- fragment_screen_slide_page.xml --> <ScrollView xmlns:android="http://sc

  • 自定义RadioButton和ViewPager实现TabHost带滑动的页卡效果

    在工作中又很多需求都不是android系统自带的控件可以达到效果的,内置的TabHost就是,只能达到简单的效果 ,所以这个时候就要自定义控件来达到效果:这个效果就是: 使用自定义RadioButton和ViewPager实现TabHost带滑动的页卡效果. 这篇文章技术含量一般,大家别见笑.源码我以测试,在底部可下载.好了先上效果图: 以下是实现步骤:        1.准备自定义RadioButton控件的样式图片等,就是准备配置文件: (1). 在项目的values文件夹里面创建 attr

  • Android利用ViewPager实现滑动广告板实例源码

    •android-support-v4.jar,这是谷歌官方给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其中之一,利用它我们可以做很多事情,从最简单的导航,到页面切换菜单等等. •ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样. •本Demo向大家演示ViewPager的使用,并在用户未滑动View时,每隔5s钟自动切换到下一个View(循环切换),而当用户有Touch到Vi

  • Android编程实现ViewPager多页面滑动切换及动画效果的方法

    本文实例讲述了Android编程实现ViewPager多页面滑动切换及动画效果的方法.分享给大家供大家参考,具体如下: 一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式, 白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了,接下来我们就来实现它. 二.在开始前,我们先要认识一个控件,ViewPager.它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换. 这个附加包是and

  • Android中ViewPager带来的滑动卡顿问题解决要点解析

    问题说明: 当SwipeRefreshLayout中放置了ViewPager控件,两者的滑动会相互冲突.具体表现为ViewPager的左右滑动不顺畅,容易被SwipeRefreshLayout拦截(即出现刷新的View). 问题原因: ViewPager本身是处理了滚动事件的冲突,它在横向滑动时会调用requestDisallowInterceptTouchEvent()方法使父控件不拦截当前的Touch事件序列.但是SwipeRefreshLayout的requestDisallowInter

随机推荐