项目中用到的第一种方法,学习借鉴了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(); }3、viewpager设置CurrentItem为1;// 下面这个方法一定要设置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));}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);
}
}
}
}
感谢开源。