**
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)這代碼也是從網上找了的.謝謝那些大神的分享,所以我也願意分享出去.記得收藏哦