图片轮播的两种实现方式(一)

项目中用到的第一种方法,学习借鉴了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);

                        }

                    }

                }

            }

}

感谢开源。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值