您的位置:首页 > 移动开发 > Android开发

我的工具太少了之Android无限轮播图片,最后一张过度动画很重要

2015-12-08 11:32 471 查看
1.为什么要写个无限轮播图片?

使用录太高啦!

2.为什么要自己写个无限轮播,Android的FilterView就可以啊!

自己写的才是最好的,FilteView滑动太不自然啦!

好啦,废话不多说,看图说代码~!

上面怎么没有图片?O(∩_∩)O~,不要在意这些细节,大家是来学习代码的,图片我用色块代替了!



好,下面是代码部分,由于轮播使用频繁,我就自定义了一个类,下次需要,只要把这个自定义类,写入xml,设置高度就可以了,什么都不用改,

当然,你还是要改为自己需要的轮播图片才可以哦!这就是尽信书不如无书的道理~!

package com.cake.util;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Scroller;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by small cake on 2015/12/3.
 */
public class CarouselView extends RelativeLayout {

    private int[] mImages = {R.drawable.page1, R.drawable.page2, R.drawable.page3, R.drawable.page4};
    private int[] mPots = {R.drawable.pot_icon_select, R.drawable.pot_icon_unselect};
    private static final int POT_SELECT = 0;
    private static final int POT_UNSELECT = 1;
    private static final int SCROLL_TIME = 5000;
    private final static boolean IS_NEED_POTS = true;
    public int myPosition=0;
    private ViewPager mViewPager;
    private LinearLayout layoutPot;
    private MyPageAdapter adapter;
    private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:

                    int index = mViewPager.getCurrentItem();
                    index = (index + 1) % list.size();
                    mViewPager.setCurrentItem(index, true);

                    mHandler.sendEmptyMessageDelayed(0, SCROLL_TIME);
                    break;
            }
        }
    };
    private ViewPagerScroller scroller;
    private List<View> list;

    public CarouselView(Context context) {
        super(context);
        init();
    }

    public CarouselView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CarouselView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mViewPager = new ViewPager(getContext());
        addViewPager();
    }

    /**
     * loading img
     */
    private void addViewPager() {
        //1.add ViewPager
        this.addView(mViewPager);

        list = new ArrayList<View>();
        ImageView imgHead = new ImageView(getContext());
        imgHead.setBackgroundResource(mImages[mImages.length-1]);
        list.add(imgHead);
        for (int resId :mImages) {
            ImageView img = new ImageView(getContext());
            img.setBackgroundResource(resId);
            list.add(img);
        }
        ImageView imgLast = new ImageView(getContext());
        imgLast.setBackgroundResource(mImages[0]);
        list.add(imgLast);

        Log.i("list","长度:"+list.size());

        adapter = new MyPageAdapter(list);
        mViewPager.setAdapter(adapter);
        //2. is need the pots
        if (IS_NEED_POTS) {
            addViewPots();
        }
        //3.listener this page
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                myPosition = position;
                if (IS_NEED_POTS) {
                    if (position>=1)
                    setSelectPot((position-1) % mImages.length);
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                //页面到达最后一页,state==0表示页面动画完成状态
                if ( myPosition >mImages.length&&state==0) {

                    mViewPager.setCurrentItem(1, false); //false:不显示跳转过程的动画,这里跳转到1
                }
            }

            private void setSelectPot(int selectNum) {
                for (int i = 0; i < mImages.length; i++) {
                    layoutPot.getChildAt(i).setBackgroundResource(mPots[POT_UNSELECT]);
                }
                layoutPot.getChildAt(selectNum).setBackgroundResource(mPots[POT_SELECT]);
            }

        });
        //4.设置过度动画
        scroller = new ViewPagerScroller(getContext());
        scroller.setScrollDuration(2000);
        scroller.initViewPagerScroll(mViewPager);

        mHandler.sendEmptyMessage(0);

    }

    /**
     * add the pots
     */
    private void addViewPots() {
        layoutPot = new LinearLayout(getContext());
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        layoutPot.setGravity(Gravity.RIGHT);
        layoutPot.setLayoutParams(layoutParams);

        LinearLayout.LayoutParams imgParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        imgParams.setMargins(8, 8, 8, 8);
        for (int i = 0; i < mImages.length; i++) {
            ImageView pot = new ImageView(getContext());
            if (i==0){

                pot.setBackgroundResource(mPots[POT_SELECT]);
            }else{
                pot.setBackgroundResource(mPots[POT_UNSELECT]);

            }

            pot.setLayoutParams(imgParams);
            layoutPot.addView(pot);
        }

        this.addView(layoutPot);

    }

    class MyPageAdapter extends PagerAdapter {
        private List<View> mListViews;

        public MyPageAdapter(List<View> views) {
            this.mListViews = views;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(mListViews.get(position));
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            View view = mListViews.get(position);
            container.addView(view);
            return view;
        }

        @Override
        public int getCount() {
            return mListViews.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

    }

    public class ViewPagerScroller extends Scroller {
        private int mScrollDuration = 2000;             // 滑动速度

        /**
         * 设置速度速度
         * @param duration
         */
        public void setScrollDuration(int duration){
            this.mScrollDuration = duration;
        }

        public ViewPagerScroller(Context context) {
            super(context);
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            super.startScroll(startX, startY, dx, dy, mScrollDuration);
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy) {
            super.startScroll(startX, startY, dx, dy, mScrollDuration);
        }

        public void initViewPagerScroll(ViewPager viewPager) {
            try {
                Field mScroller = ViewPager.class.getDeclaredField("mScroller");
                mScroller.setAccessible(true);
                mScroller.set(viewPager, this);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }

}
其实代码很简单,大家看看都能懂,不懂的留言!也欢迎爱交流吐槽的同学~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: