圖片輪播的兩種實現方式(一)
專案中用到的第一種方法,學習借鑑了https://github.com/qingse/ImageSlideshow
自定義ImageSlideshow,繼承自FrameLayout,在構造方法中,初始化資料:
public ImageSlideshow(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; // 初始化View initView(); // 初始化Animator initAnimator(); // 初始化資料initData(); }
initView()方法中中載入viewpager和指示器的佈局;
ImageSlideshow中的屬性List<ImageTitleBean> imageTitleBeanList是輪播圖中的資料,setViewPager(List<ImageTitleBean> imageTitleBeanList)方法中,做了這樣幾步工作:
1、在setViewList(imageTitleBeanList)方法中初始化輪播圖的每個view;輪播圖的view數量是在實際數量的基礎上前後各加一張圖片,實際第一張圖片位置為1,當第一張圖片向左滑動時,當前
位置變為0,這時把當前圖片設定為實際最後一張圖片;當前顯示圖片為實際最後一張圖片時,繼續向右滑動,位置再加1時,把當前位置圖片設定為實際第一章圖片。
2、給viewpager設定adapter,繼承自PagerAdapter,重寫這幾個方法:
@Override public int getCount() { return viewList.size(); }
// 下面這個方法一定要設定view == object,否則圖片顯示不出來
@Overridepublic boolean isViewFromObject(View view, Object object) { return view == object;}@Overridepublic Object instantiateItem(ViewGroup container, final int view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
container.addView(view); return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewList.get(position));}3、viewpager設定CurrentItem為1;4、viewpager設定監聽器,重寫以下方法
@Override
public void onPageSelected(int position) {
// 後面再說
}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
// 閒置中
case ViewPager.SCROLL_STATE_IDLE:
// 偷樑換柱,這裡的切換肉眼看不出來,就實現了無縫輪播
if (viewpager.getCurrentItem() == 0) {
viewpager.setCurrentItem(count, false);
} else if (viewpager.getCurrentItem() == count + 1) {
viewpager.setCurrentItem(1, false);
}
currentItem = vpImageTitle.getCurrentItem();
break;
......
}
}
5、setIndicator()把圖片指示的小圓點繪製上去。
6、viewpager監聽器中的另一個方法:
public void onPageSelected(int position) {
// 當viewpager中的item滑動完成後,遍歷每一個指示器圓點,將被選中的原點放大,未被選中的原點縮小。
for (int i = 0; i < llDot.getChildCount(); i++) {
if (i == position - 1) {// 被選中
llDot.getChildAt(i).setBackgroundResource(R.drawable.dot_selected);
if (!isLarge.get(i)) {
animatorToLarge.setTarget(llDot.getChildAt(i));
animatorToLarge.start();
isLarge.put(i, true);
}
} else {// 未被選中
llDot.getChildAt(i).setBackgroundResource(R.drawable.dot_unselected);
if (isLarge.get(i)) {
animatorToSmall.setTarget(llDot.getChildAt(i));
animatorToSmall.start();
isLarge.put(i, false);
}
}
}
}
}感謝開源。