參考網址:http://my.oschina.net/xsk/blog/119167
整體的架構:ViewPgaer 中直接嵌套 IamgeView
方案一: 重寫Viewpager 這樣有侷限性。 這裏的案例是 本地靜態的圖像
原本的實現原理: 這裏是一種模擬方式 實現的 “無線的循環”, 其實並不是 真正意義上的無線循環。 而是 設置的值很大,用於 當做 無線循環。
設置默認選中的很大的值:
viewPager.setCurrentItem(100000 * imageResId.length);
在 PagerAdapter 初始化的方法中: 只需要 創建一個 ImageView 即可!
代碼:
package stu.hades;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.example.hadesviewpagerdemo.R;
public class MyViewPager extends ViewPager {
protected Context mContext = null;
protected ViewPager viewPager = null;
//1、定義圖片資源數組,有幾個就寫幾個,也可以動態填充
public static int[] imageResId = new int[] {R.drawable.aaa,R.drawable.aab, R.drawable.aac,R.drawable.aad};
//2、初始化一些參數
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
viewPager = this;
}
//3、視圖初始化後配置適配器和監聽
@Override
protected void onFinishInflate() {
super.onFinishInflate();
viewPager.setAdapter(new MyAdapter(mContext));
//設定啓示位置,設這麼大,以便可以左循環100000次,應該沒有人滑動這麼頻繁吧!
viewPager.setCurrentItem(100000 * imageResId.length);
viewPager.setOnPageChangeListener(new MyPageChangeListener());
}
//3、圖片更改監聽器
private class MyPageChangeListener implements OnPageChangeListener {
protected int oldPosition = 0;
//下面裏是顯示當前圖片位置的圈圈,這裏是個參考,大家可以自己寫,即便註釋不影響滑動
public void onPageSelected(int position) {
// LinearLayout image_viewpager_circle = (LinearLayout) ((RelativeLayout) viewPager.getParent()).findViewById(R.id.main_image_viewpager_circle);
// ((ImageView) image_viewpager_circle.getChildAt(oldPosition)).setImageResource(R.drawable.dot_normal);
// ((ImageView) image_viewpager_circle.getChildAt(position% imageResId.length)).setImageResource(R.drawable.dot_focused);
oldPosition = position % imageResId.length;
}
public void onPageScrollStateChanged(int arg0) {
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
}
@Override
protected void onMeasure(int arg0, int arg1) {
super.onMeasure(arg0, arg1);
}
}
2 adapter
package stu.hades;
import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
public class MyAdapter extends PagerAdapter {
public Context mContext;
public MyAdapter(Context mContext) {
this.mContext = mContext;
}
// 給適配設定元素數最大值,可以無限右滑動,左滑動不能超過100000次
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return super.getItemPosition(object);
}
// 這個大家都懂的,用法可以百度或者OSCHINA一下,我白話文:每次初始化當前視圖和左右兩側的視圖
@Override
public Object instantiateItem(View arg0, int position) {
// TODO Auto-generated method stub
int posi = position % MyViewPager.imageResId.length;
// 每次添加新視圖,雖然有點耗資源,但不會有衝突,並且在視圖切換過程中,會銷燬無用的視圖。
ImageView xImageView = new ImageView(mContext);
xImageView.setBackgroundResource(MyViewPager.imageResId[posi]);
android.view.ViewGroup.LayoutParams para = new android.view.ViewGroup.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
xImageView.setAdjustViewBounds(true);
xImageView.setLayoutParams(para);
((ViewPager) arg0).addView(xImageView, 0);
return xImageView;
}
@Override
public void destroyItem(View arg0, int position, Object arg2) {
// 銷燬不需要的視圖
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
代碼網址:http://pan.baidu.com/s/1pJMDVMb
參考方案 二: 不重寫 VIewpager
直接使用Viewpager, 但是 一樣需要設置 VIewpager.setCurrentItem();
注意: 很重要的一點 VIewpager 中 ImageView 的重用問題, 不要每一都創建很麻煩。
VIewPgaer重用: 自己再往搜一下, 原理很簡單。就是講ImageView放到 集合中, 通通過 add(ImageView) remove() 實現 ImageView 的重用!