MainActivity如下:
1 package cc.ww; 2 3 import java.util.ArrayList; 4 5 import android.app.Activity; 6 import android.content.Context; 7 import android.os.Bundle; 8 import android.os.Handler; 9 import android.os.Message; 10 import android.support.v4.view.ViewPager; 11 import android.view.MotionEvent; 12 import android.view.View; 13 import android.view.ViewGroup; 14 import android.view.Window; 15 import android.view.WindowManager; 16 import android.view.View.OnTouchListener; 17 import android.widget.ImageView; 18 import android.widget.LinearLayout; 19 /** 20 * 原创作者: 21 * 谷哥的小弟 http://blog.csdn.net/lfdfhl 22 * 23 * Demo描述: 24 * 1 ViewPager的自动轮播 25 * 2 同时支持手动切换ViewPager的Item 26 * 3 解决了当图片小于三张ViewPager轮播时崩溃的问题 27 */ 28 public class MainActivity extends Activity { 29 private Context mContext; 30 private Handler mHandler; 31 private Runnable mRunnable; 32 private ViewPager mViewPager; 33 private int viewPagerItemSize=0; 34 private ImageView[] dotImageViews; 35 private final int INTERVAL =1000 * 3; 36 private ArrayList<Integer> mArrayList; 37 private LinearLayout mDotsLinearLayout; 38 private final static int SET_VIEWPAGER_ITEM=9527; 39 private LauncherViewPagerAdapter mViewPagerAdapter; 40 private PageChangeListenerImpl mPageChangeListenerImpl; 41 42 @Override 43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 //去掉状态栏 46 requestWindowFeature(Window.FEATURE_NO_TITLE); 47 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 48 WindowManager.LayoutParams.FLAG_FULLSCREEN); 49 setContentView(R.layout.activity_main); 50 init(); 51 } 52 53 54 //初始化 55 private void init() { 56 initData(); 57 if(viewPagerItemSize>0){ 58 initDots(); 59 initViewPager(); 60 setAutoChangeViewPager(); 61 } 62 } 63 64 65 //准备ViewPager将显示的数据 66 private void initData(){ 67 mContext = this; 68 mArrayList=new ArrayList<Integer>(); 69 mArrayList.add(R.drawable.a); 70 mArrayList.add(R.drawable.b); 71 mArrayList.add(R.drawable.c); 72 mArrayList.add(R.drawable.d); 73 viewPagerItemSize=mArrayList.size(); 74 } 75 76 77 //初始化ViewPager 78 private void initViewPager(){ 79 mViewPager = (ViewPager) findViewById(R.id.guide_viewpager); 80 mViewPagerAdapter = new LauncherViewPagerAdapter(mContext); 81 mViewPagerAdapter.setAdapterData(mArrayList); 82 mViewPager.setAdapter(mViewPagerAdapter); 83 int currentItem = Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2 % viewPagerItemSize; 84 mViewPager.setCurrentItem(currentItem); 85 setdotImageViews(currentItem%viewPagerItemSize); 86 mViewPager.setOnTouchListener(new OnTouchListener() { 87 @Override 88 public boolean onTouch(View arg0, MotionEvent arg1) { 89 mViewPager.requestDisallowInterceptTouchEvent(true); 90 return false; 91 } 92 }); 93 } 94 95 96 //初始化底部小圆点 97 private void initDots() { 98 mDotsLinearLayout = (LinearLayout) findViewById(R.id.dotsLinearLayout); 99 dotImageViews = new ImageView[viewPagerItemSize]; 100 for (int i = 0; i < dotImageViews.length; i++) { 101 LinearLayout layout = new LinearLayout(mContext); 102 ImageView imageView = new ImageView(mContext); 103 imageView.setLayoutParams(new ViewGroup.LayoutParams(20, 20)); 104 if (i == 0) { 105 imageView.setBackgroundResource(R.drawable.guide_dot_white); 106 } else { 107 layout.setPadding(20, 0, 0, 0); 108 imageView.setBackgroundResource(R.drawable.guide_dot_black); 109 } 110 dotImageViews[i] = imageView; 111 layout.addView(imageView); 112 mDotsLinearLayout.addView(layout); 113 } 114 } 115 116 117 //开启ViewPager的自动轮播 118 @SuppressWarnings("deprecation") 119 private void setAutoChangeViewPager() { 120 mPageChangeListenerImpl = new PageChangeListenerImpl(); 121 mViewPager.setOnPageChangeListener(mPageChangeListenerImpl); 122 123 mHandler = new Handler() { 124 @Override 125 public void handleMessage(Message msg) { 126 super.handleMessage(msg); 127 switch (msg.what) { 128 case SET_VIEWPAGER_ITEM: 129 if (mViewPager != null && mViewPagerAdapter != null) { 130 int currentItemIndex = mViewPager.getCurrentItem(); 131 int itemsCount = mViewPagerAdapter.getCount(); 132 if ((currentItemIndex + 1) < itemsCount) { 133 mViewPager.setCurrentItem(currentItemIndex + 1, true); 134 } else { 135 mViewPager.setCurrentItem(0, false); 136 } 137 } 138 break; 139 } 140 } 141 }; 142 143 mRunnable = new Runnable() { 144 @Override 145 public void run() { 146 Message message = mHandler.obtainMessage(); 147 message.what = SET_VIEWPAGER_ITEM; 148 mHandler.sendMessage(message); 149 mHandler.removeCallbacks(mRunnable); 150 mHandler.postDelayed(this, INTERVAL); 151 } 152 }; 153 154 mHandler.postDelayed(mRunnable, INTERVAL); 155 } 156 157 158 //设置小圆点的显示 159 private void setdotImageViews(int selected){ 160 for (int i = 0; i < dotImageViews.length; i++) { 161 dotImageViews[selected].setBackgroundResource(R.drawable.guide_dot_white); 162 if (selected != i) { 163 dotImageViews[i].setBackgroundResource(R.drawable.guide_dot_black); 164 } 165 } 166 } 167 168 //ViewPager翻页后更新小圆点的显示 169 private class PageChangeListenerImpl implements ViewPager.OnPageChangeListener { 170 @Override 171 public void onPageSelected(int selected) { 172 setdotImageViews(selected % viewPagerItemSize); 173 } 174 175 @Override 176 public void onPageScrolled(int arg0, float arg1, int arg2) { 177 } 178 179 @Override 180 public void onPageScrollStateChanged(int state) { 181 182 } 183 184 } 185 186 @Override 187 protected void onDestroy() { 188 super.onDestroy(); 189 if(null!=mViewPager){ 190 mViewPager.removeAllViews(); 191 mViewPager = null; 192 } 193 } 194 195 }
LauncherViewPagerAdapter如下:
1 package cc.ww; 2 3 import java.util.ArrayList; 4 import android.content.Context; 5 import android.support.v4.view.PagerAdapter; 6 import android.view.LayoutInflater; 7 import android.view.View; 8 import android.view.ViewGroup; 9 import android.widget.ImageView; 10 import android.widget.Toast; 11 12 public class LauncherViewPagerAdapter extends PagerAdapter { 13 private Context mContext; 14 private ArrayList<Integer> pagesArrayList; 15 private View itemView; 16 17 public LauncherViewPagerAdapter(Context context) { 18 this.mContext = context; 19 } 20 21 /** 22 * 设置ViewPager将要显示的数据. 23 * 当图片数量小于三张的时候,通过复制组拼数据 24 */ 25 public void setAdapterData(ArrayList<Integer> arrayList){ 26 pagesArrayList=arrayList; 27 if (pagesArrayList.size()<1) { 28 Toast.makeText(mContext, "ViewPager item size=0", Toast.LENGTH_LONG).show(); 29 }else if(pagesArrayList.size()<2){ 30 pagesArrayList.add(pagesArrayList.get(0)); 31 pagesArrayList.add(pagesArrayList.get(0)); 32 pagesArrayList.add(pagesArrayList.get(0)); 33 }else if(pagesArrayList.size()<3){ 34 pagesArrayList.add(pagesArrayList.get(0)); 35 pagesArrayList.add(pagesArrayList.get(1)); 36 } 37 System.out.println("-----> PagerAdapter中item的个数="+pagesArrayList.size()); 38 } 39 40 41 @Override 42 public int getCount() { 43 return Integer.MAX_VALUE; 44 } 45 46 47 @Override 48 public Object instantiateItem(ViewGroup container, int position) { 49 if (pagesArrayList.size() > 0) { 50 itemView=LayoutInflater.from(mContext).inflate(R.layout.guide_pager_adapter, null); 51 itemView.setFocusable(true); 52 ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView); 53 imageView.setBackgroundResource(pagesArrayList.get(position%pagesArrayList.size())); 54 container.addView(itemView); 55 return itemView; 56 } 57 return null; 58 59 } 60 61 62 @Override 63 public boolean isViewFromObject(View arg0, Object arg1) { 64 return arg0 == arg1; 65 } 66 67 @Override 68 public void destroyItem(ViewGroup container, int position, Object object) { 69 container.removeView((View) object); 70 } 71 }
activity_main.xml如下:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <android.support.v4.view.ViewPager 7 android:id="@+id/guide_viewpager" 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" /> 10 11 <LinearLayout 12 android:id="@+id/dotsLinearLayout" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:layout_alignParentBottom="true" 16 android:layout_marginBottom="100px" 17 android:layout_centerHorizontal="true" 18 android:orientation="horizontal"> 19 </LinearLayout> 20 21 22 23 </RelativeLayout>
guide_pager_adapter.xml如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <ImageView 7 android:id="@+id/imageView" 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" /> 10 11 </RelativeLayout>