您的位置:首页 > 其它

ViewPager无限自动轮播+动画

2016-12-02 14:09 330 查看
ViewPager几乎在每一个app中都会有使用,可以做导航页,也可以做广告、图片的播放。最近在做的app也用到了ViewPager,具体要实现的功能是能够无限轮播,并且在自动轮播时,图片在切换时能够有动画效果,当手指触摸时停止自动轮播,手指抬起时继续自动轮播。

闲话不多说,直接上代码

自定义ViewPager:

[java]
view plain
copy

public class MyViewPager extends ViewPager {  

// 当前页  

private int currentItem;  

// ViewPagerAdapter实例  

private ViewPagerAdapter mAdapter;  

  

public MyViewPager(Context context) {  

    super(context);  

}  

  

public MyViewPager(Context context, AttributeSet attrs) {  

    super(context, attrs);  

}  

  

@Override  

public void setAdapter(PagerAdapter adapter) {  

    mAdapter = (ViewPagerAdapter) adapter;  

    super.setAdapter(mAdapter);  

}  

  

/** 

 * 获取当前页 

 *  

 * @return 

 */  

public int getCurrentItem() {  

    return mAdapter.getMyPosition();  

}  

  

/** 

 * 获取MyViewPager实例 

 *  

 * @return 

 */  

public MyViewPager getMyViewPager() {  

    return mAdapter.getMyViewPager();  

}  

  

/** 

 * 设置当前页 

 *  

 * @param item 

 * @param smoothScroll 

 */  

public void setCurrentItem(int item, boolean smoothScroll) {  

    super.setCurrentItem(item, smoothScroll);  

}  

  

// 是否自动轮播  

private boolean isStart = true;  

// Handler  

private Handler mHandler = new Handler();  

// 图片自动轮播Task  

private Runnable mImageTimerTask = new Runnable() {  

  

    @Override  

    public void run() {  

        try {// 自定义图片切换速度  

            Field field = ViewPager.class.getDeclaredField("mScroller");  

            field.setAccessible(true);  

            FixedSpeedScroller scroller = new FixedSpeedScroller(  

                    getContext(), new AccelerateInterpolator());  

            field.set(getMyViewPager(), scroller);  

            scroller.setmDuration(500);  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

        currentItem = getCurrentItem();  

        int amount = currentItem;  

                       /** 

                 * 解决往左滑动后变成向左自动轮播的bug 

                 */  

        if(oldCurrentItem < currentItem){  

            setCurrentItem(currentItem, true);  

        }else{  

            currentItem += 2;  

            setCurrentItem(currentItem, true);  

        }  

        oldCurrentItem = amount;  

        if (isStart)  

            mHandler.postDelayed(mImageTimerTask, 2000);  

    }  

};  

  

/** 

 * 触摸事件: ACTION_DOWN 停止自动轮播 ACTION_UP 开始自动轮播 

 */  

@Override  

public boolean dispatchTouchEvent(MotionEvent event) {  

    if (event.getAction() == MotionEvent.ACTION_UP) {  

        // 开始图片滚动  

        startImageTimerTask();  

    } else if (event.getAction() == MotionEvent.ACTION_DOWN) {  

        // 停止图片滚动  

        stopImageTimerTask();  

    }  

    return super.dispatchTouchEvent(event);  

}  

  

/** 

 * 停止自动轮播 

 */  

public void stopImageTimerTask() {  

    isStart = false;  

    mHandler.removeCallbacks(mImageTimerTask);  

}  

  

/** 

 * 开始自动轮播 

 */  

public void startImageTimerTask() {  

    isStart = true;  

    mHandler.postDelayed(mImageTimerTask, 2000);  

}  

  自定义PagerAdapter:

[b][java]
view plain
copy[/b]

 public class ViewPagerAdapter extends PagerAdapter {  

    private List<view> viewList;  

    private int mPosition;  

    private MyViewPager mViewPager;  

  

    public ViewPagerAdapter(List<view> viewList, MyViewPager viewPager) {  

        super();  

        this.viewList = viewList;  

        mViewPager = viewPager;  

    }  

  

    /** 

     * 将count设为最大的整数,以达到无限轮播的效果 

     */  

    @Override  

    public int getCount() {  

        return Integer.MAX_VALUE;  

    }  

  

    @Override  

    public boolean isViewFromObject(View view, Object object) {  

        return view == object;  

    }  

  

    @Override  

    public void destroyItem(ViewGroup <a href="http://lib.csdn.net/base/docker" class='replace_word' title="Docker知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Container</a>, int position, Object object) {  

        ((ViewPager) container).removeView(viewList.get(position  

                % viewList.size()));  

  

    }  

  

    @Override  

    public Object instantiateItem(ViewGroup container, int position) {  

        mPosition = position;  

        ((ViewPager) container)  

                .addView(viewList.get(position % viewList.size()));  

        return viewList.get(position % viewList.size());  

    }  

  

    /** 

     * 获取当前页 

     *  

     * @return 

     */  

    public int getMyPosition() {  

        return mPosition;  

    }  

  

    /** 

     * 获取MyViewPager实例 

     *  

     * @return 

     */  

    public MyViewPager getMyViewPager() {  

        return mViewPager;  

    }  

  

}</view></view>  

切换动画google给的DepthPageTransformer:

     

[b][java] view
plain copy[/b]

public class DepthPageTransformer implements PageTransformer {  

    private static final float MIN_SCALE = 0.75f;  

  

    @Override  

    public void transformPage(View view, float position) {  

        int pageWidth = view.getWidth();  

        if (position < -1) {  

            view.setAlpha(0);  

        } else if (position <= 0) {  

            view.setAlpha(1);  

            view.setTranslationX(0);  

            view.setScaleX(1);  

            view.setScaleY(1);  

        } else if (position <= 1) {  

            view.setAlpha(1 - position);  

            view.setTranslationX(pageWidth * -position);  

            float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)  

                    * (1 - Math.abs(position));  

            view.setScaleX(scaleFactor);  

            view.setScaleY(scaleFactor);  

        } else {   

            view.setAlpha(0);  

  

        }  

    }  

  

}  

     切换速度自定义:

      

[b][java] view
plain copy[/b]

public class FixedSpeedScroller extends Scroller {  

    private int mDuration = 1500;  

  

    public FixedSpeedScroller(Context context) {  

        super(context);  

    }  

  

    public FixedSpeedScroller(Context context, Interpolator interpolator) {  

        super(context, interpolator);  

    }  

  

    @Override  

    public void startScroll(int startX, int startY, int dx, int dy, int duration) {  

        super.startScroll(startX, startY, dx, dy, mDuration);  

    }  

  

    @Override  

    public void startScroll(int startX, int startY, int dx, int dy) {  

        super.startScroll(startX, startY, dx, dy, mDuration);  

    }  

  

    public void setmDuration(int time) {  

        mDuration = time;  

    }  

  

    public int getmDuration() {  

        return mDuration;  

    }  

}  

     小圆点的变换:

      

[b][java] view
plain copy[/b]

public void onPageSelected(int position) {  

        dots.get(oldPosition % viewList.size()).setBackgroundResource(  

                R.drawable.dot_normal);  

        dots.get(position % viewList.size()).setBackgroundResource(  

                R.drawable.dot_focused);  

  

        oldPosition = position;  

    }  

     最后:

     

[b][java] view
plain copy[/b]

mViewPager.setCurrentItem(500);  

        mViewPager.setPageTransformer(true, new DepthPageTransformer());  

        mViewPager.startImageTimerTask();  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: