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();
}
}
}
}
其实代码很简单,大家看看都能懂,不懂的留言!也欢迎爱交流吐槽的同学~!