**
ViewPager自动无限循环滑动
通过handler发送消息,实现自动无限循环,代码拿过来就可以用.
**
先上GIF图
当然,这里采用的无限循环,网络上大部分都是这样做的.不算是真正的循环,但是是循环效果
好了,废话不多说,代码来了
布局文件的xml文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>
</FrameLayout>
布局文件嘛,仁者见仁智者见智,一切方便为主
下面是代码块:是在MainActivity里面的.反正就是一个布局文件,一个代码文件.
package com.wangjun.viewpager;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
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.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class MainActivity extends Activity implements OnPageChangeListener{
/**
* ViewPager
*/
private ViewPager viewPager;
/**
* 装点点的ImageView数组
*/
private ImageView[] tips;
/**
* 装ImageView数组
*/
private ImageView[] mImageViews;
/**
* 图片资源id
*/
private int[] imgIdArray ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.sendEmptyMessageDelayed(0, 2000);
ViewGroup group = (ViewGroup)findViewById(R.id.viewGroup);
viewPager = (ViewPager) findViewById(R.id.viewPager);
//载入图片资源ID
imgIdArray = new int[]{
R.drawable.png_01,
R.drawable.png_02,
R.drawable.png_03,
R.drawable.png_04,
};
//将点点加入到ViewGroup中
tips = new ImageView[imgIdArray.length];
for(int i=0; i<tips.length; i++){
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new LayoutParams(10,10));
tips[i] = imageView;
if(i == 0){
tips[i].setBackgroundResource(R.drawable.ic_unread);
}else{
tips[i].setBackgroundResource(R.drawable.ic_unread_2);
}
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
layoutParams.leftMargin = 5;
layoutParams.rightMargin = 5;
group.addView(imageView, layoutParams);
}
//将图片装载到数组中
mImageViews = new ImageView[imgIdArray.length];
for(int i=0; i<mImageViews.length; i++){
ImageView imageView = new ImageView(this);
mImageViews[i] = imageView;
imageView.setBackgroundResource(imgIdArray[i]);
}
//设置Adapter
viewPager.setAdapter(new MyAdapter());
//设置监听,主要是设置点点的背景
viewPager.setOnPageChangeListener(this);
//设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动
viewPager.setCurrentItem((mImageViews.length) * 100);
}
/**
*
* @author xiaanming
*
*/
public class MyAdapter extends PagerAdapter{
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);
}
/**
* 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
*/
@Override
public Object instantiateItem(View container, int position) {
((ViewPager)container).addView(mImageViews[position % mImageViews.length], 0);
return mImageViews[position % mImageViews.length];
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
setImageBackground(arg0 % mImageViews.length);
}
/**
* 设置选中的tip的背景
* @param selectItems
*/
private void setImageBackground(int selectItems){
for(int i=0; i<tips.length; i++){
if(i == selectItems){
tips[i].setBackgroundResource(R.drawable.ic_unread);
}else{
tips[i].setBackgroundResource(R.drawable.ic_unread_2);
}
}
}
/**
* 上面的代码中,当只有3张图片或者2张图片的时候,滑动存在BUG问题的修改如下
*destroyItem(View container, int position, Object object)方法中不removeView
* 也就是将下面这句注销了就OK .继续完成下面的那个设置,也就是增加异常捕捉
* //((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);
**/
/**
* instantiateItem(View container, int position)增加异常扑捉
*[java] view plain copy 在CODE上查看代码片派生到我的代码片
*@Override
* public Object instantiateItem(View container, int position) {
* try {
* ((ViewPager)container).addView(mImageViews[position % mImageViews.length], 0);
* }catch(Exception e){
* //handler something
* }
* return mImageViews[position % mImageViews.length];
*}
*
* */
/*
* 自动循环有多种实现方式:
* 1、定时器:Timer
* 2、开子线程 while true 循环
* 3、ColckManager
* 4、 用handler 发送延时信息,实现循环
*/
//这里我们用第四种,比较高效:
//<span style="white-space:pre"> </span>//判断是否自动滚动的标志
private boolean isrunning = true;
/**
* 自动滑动的Handler
* 利用 Handler.sendEmptyMessageDelayed方法,实现定时滚动
*
*/
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
//让ViewPager滑到下一页
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
//延时,循环调用handler
if(isrunning){
handler.sendEmptyMessageDelayed(0, 2000);
}
};
};
/**
* Activity生命周期结束时终止定时,否则可能一直进行下去
*/
protected void onDestroy() {
super.onDestroy();
isrunning = false;
};
//在onCreate()方法中发送一个消息启动Handler。
}
注意:注意:注意:
1)图片嘛,你自己找哈,此处是废话
2)你点击下面的小圆点,是不会发生跳转的.它只是一个图片.你可以添加点击事件,或者,你也可以用RadioGroup里放RadioButton来做.这里我就不做具体的演示了.
3)这代码也是从网上找了的.谢谢那些大神的分享,所以我也愿意分享出去.记得收藏哦