一个可以通过简单的代码实现无限轮播效果的自定义控件。
1.自定义view代码
public class MyView extends RelativeLayout { private ViewPager viewPager; private LinearLayout linearLayout; private int size; private Context context; private List<Button> list; private Timer timer; private int delay = 2000; private int current = 0; private Boolean isTimer = false; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { current++; viewPager.setCurrentItem(current); } } }; public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.view_carouselfigure, this, true); this.context = context; } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFinishInflate() { super.onFinishInflate(); viewPager = (ViewPager) findViewById(R.id.viewpager); linearLayout = (LinearLayout) findViewById(R.id.linearlayout); } public void setAdapter(PagerAdapter pagerAdapter) { viewPager.setAdapter(pagerAdapter); setPager(); } public void setAdapter(FragmentPagerAdapter fragmentPagerAdapter) { viewPager.setAdapter(fragmentPagerAdapter); setPager(); } public void setSize(int size) { this.size = size; list = new ArrayList<Button>(); for (int i = 0; i < size-2; i++) { Button button = new Button(context); button.setBackgroundResource(R.drawable.selsct); button.setTag(i); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { viewPager.setCurrentItem((Integer) v.getTag()+1, false); } }); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(30, 30); layoutParams.leftMargin = 10; layoutParams.rightMargin = 10; button.setLayoutParams(layoutParams); linearLayout.addView(button); list.add(button); } } private void setPager() { viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { current = position; for (int i = 0; i < size-2; i++) { list.get(i).setEnabled(true); } if (current == 0) { list.get(size - 3).setEnabled(false); } else if (current == size - 1) { list.get(0).setEnabled(false); } else { list.get(position-1).setEnabled(false); } current = position; } @Override public void onPageScrollStateChanged(int state) { switch (state) { case ViewPager.SCROLL_STATE_DRAGGING: if (timer != null) { timer.cancel(); timer = null; } break; case ViewPager.SCROLL_STATE_IDLE: if (current == 0) { viewPager.setCurrentItem(size - 2, false); } else if (current == size - 1) { viewPager.setCurrentItem(1, false); } if (isTimer) { if (timer == null) { current--; setTimer(delay); } } break; } } }); viewPager.setCurrentItem(1); list.get(0).setEnabled(false); } public void setTimer(int s) { isTimer = true; timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { handler.sendEmptyMessage(1); } }, s, delay); } public void destoryTimer() { timer.cancel(); timer = null; } public void setDelay(int delay) { this.delay = delay; } }
2.布局文件代码
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> <LinearLayout android:id="@+id/linearlayout" android:layout_width="match_parent" android:layout_height="30dp" android:orientation="horizontal" android:layout_alignBottom="@id/viewpager" android:gravity="center" android:paddingLeft="5dp" android:paddingRight="5dp" > </LinearLayout> </RelativeLayout>3.使用方式
我们只需在设置图片源的时候增加两张图片
布局文件
<com.plgf.parking.firstlibrary.MyView android:id="@+id/myview" android:layout_width="match_parent" android:layout_height="200dp"> </com.plgf.parking.firstlibrary.MyView>具体使用