1. 程式人生 > >圖片輪播的兩種實現方式(一)

圖片輪播的兩種實現方式(一)

專案中用到的第一種方法,學習借鑑了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
position) { View view = viewList.get(position); // 設定Item的點選監聽器

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);

                        }

                    }

                }

            }

}

感謝開源。