Android使用ViewPager实现左右无限滑动

前言

网上有很多使用ViewPager实现左右滑动这一效果的资料,这些资料大多数都是将PagerAdapter中getCount()方法的返回值设为Integer.MAX_VALUE使用户看不到边界,然后在instantiateItem()方法中通过position%(要循环显示的数据集的长度)的方式取得对应的数据集。这样虽然可以做到无限循环,但是会有两个弊端:首先会创建大量对象,容易引起内存溢出(循环加载图片)从而影响性能;其次从第一页向右滑动的时候是无法滑动的。

今天给大家分享的是另一种实现方式:创建三个图片视图放入ViewPager中默认选中第二页,在接下来的滑动中每次滑动结束之后都将当前页码设置为第二页,然后通过判断是向左向右滑动来设置视图中的数据集,这样就可以实现无限循环了,而且只会创建三个图片视图对象。

示例源码

package com.viewpager; 

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.app.Activity; 

public class MainActivity01 extends Activity implements OnPageChangeListener { 

 private ViewPager viewPager;
 static final int arrays[] = { R.drawable.guide1, R.drawable.guide2,
   R.drawable.guide3, R.drawable.guide4, R.drawable.guide5 };
 private List<ImageView> views;
 private int currentPage = 0;
 private ImageView imageView; 

 private MyViewPagerAdapter viewPagerAdapter; 

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

 private void initWidget() {
  viewPager = (ViewPager) findViewById(R.id.viewpager); 

  views = new ArrayList<ImageView>();
  for (int i = 0; i < 3; i++) {
   imageView = new ImageView(this);
   imageView.setLayoutParams(new ViewGroup.LayoutParams(
     ViewGroup.LayoutParams.MATCH_PARENT,
     ViewGroup.LayoutParams.MATCH_PARENT));
   views.add(imageView);
  } 

  initImageData(); 

  viewPagerAdapter = new MyViewPagerAdapter();
  viewPager.setAdapter(viewPagerAdapter);
  viewPager.setCurrentItem(1);
  viewPager.setOnPageChangeListener(this);
 } 

 private void initImageData() {
  for (int i = 0; i < 3; i++) {
   imageView = views.get(i);
   if (i == 0) {
    imageView.setImageResource(arrays[arrays.length - 1]);
   } else {
    imageView.setImageResource(arrays[i - 1]);
   }
  }
 } 

 class MyViewPagerAdapter extends PagerAdapter { 

  @Override
  public int getCount() {
   // TODO Auto-generated method stub
   return views.size();
  } 

  @Override
  public boolean isViewFromObject(View arg0, Object arg1) {
   // TODO Auto-generated method stub
   return arg0 == arg1;
  } 

  @Override
  public Object instantiateItem(ViewGroup container, int position) {
   imageView = views.get(position);
   container.addView(imageView);
   return imageView;
  } 

  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
   // TODO Auto-generated method stub
   container.removeView((View) object);
  } 

 } 

 // 当滑动状态改变时调用
 @Override
 public void onPageScrollStateChanged(int state) {
  // TODO Auto-generated method stub
  System.out.println("--onPageScrollStateChanged--state--:" + state);
  switch (state) {
  // 在滚动完成后
  case ViewPager.SCROLL_STATE_IDLE:
   int currentItem = viewPager.getCurrentItem(); 

   System.out.println("--currentItem--00--:" + currentItem);
   System.out.println("--currentPage--00--:" + currentPage);
   if (viewPager.getCurrentItem() == 1) {
    // 如果位置没有变终止循环
    break;
   } 

   if (viewPager.getCurrentItem() > 1) {
    currentPage++;
   } else {
    currentPage--;
   } 

   System.out.println("--currentPage--11--:" + currentPage);
   if (currentPage == arrays.length) {
    currentPage = 0;
   } 

   if (currentPage == -1) {
    currentPage = arrays.length - 1;
   } 

   System.out.println("--currentPage--22--:" + currentPage); 

   if (currentPage == 0) {
    views.get(0).setImageResource(arrays[arrays.length - 1]);
   } else {
    views.get(0).setImageResource(arrays[currentPage - 1]);
   } 

   views.get(1).setImageResource(arrays[currentPage]); 

   if (currentPage == arrays.length - 1) {
    views.get(2).setImageResource(arrays[0]);
   } else {
    views.get(2).setImageResource(arrays[currentPage + 1]);
   } 

   viewPager.setCurrentItem(1, false); 

   currentItem = viewPager.getCurrentItem(); 

   System.out.println("--currentItem--11--:" + currentItem);
   break;
  }
 } 

 // 当当前页面被滑动时调用
 @Override
 public void onPageScrolled(int position, float positionOffset,
   int positionOffsetPixels) {
  // TODO Auto-generated method stub
  // System.out.println("--onPageScrolled--position--:" + position);
 } 

 // 当新的页面被选中时调用
 @Override
 public void onPageSelected(int position) {
  // TODO Auto-generated method stub
  System.out.println("--onPageSelected--position--:" + position);
 }
} 

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

(0)

相关推荐

  • 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实现可滑动的标签栏示例分享

    复制代码 代码如下: 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这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,上面是效果图,用美女图片是我一贯的作风,呵呵  1.    首先看一些layout下的xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=&qu

  • 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 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,这种情况其实很典型.现在大部分应用最外层都是

  • Android利用ViewPager实现可滑动放大缩小画廊效果

    画廊在很多的App设计中都有,如下图所示: 该例子是我没事的时候写的一个小项目,具体源码地址请访问https://github.com/AlexSmille/YingMi. 该画廊类似封面的效果,滑到中间的图片会慢慢变大,离开的View会慢慢的缩小,同时可设置滑动监听和点击监听. 网上有很多例子都是通过Gallery实现的,而上例的实现是通过ViewPager实现,解决了性能优化的问题,今天特此把它抽出来,封装一下,以便以后的方便使用.最终实现的效果如下: 使用方式 布局中添加该自定义控件 <R

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

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

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

    页面拖动到最后一页 再向下滑动回复到 第一页,第一页向前滑动回到 最后一页 同时,底部红色小圆点随着页面的滑动距离比例随时改变位置 布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas

随机推荐