1. 程式人生 > >ViewPager圖片橫向自動輪播方法2

ViewPager圖片橫向自動輪播方法2

public class MainActivity extends AppCompatActivity {
    private static ViewPager viewPager;
    private RadioGroup group;
    //圖片資源,實際專案需要從網路獲取
    private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawable.ym4};
    //存放圖片的陣列
    private List<ImageView> mList;
    //當前索引位置以及上一個索引位置
private static int index = 0, preIndex = 0; //是否需要輪播標誌 private boolean isContinue = true; //定時器,用於實現輪播 private Timer timer = new Timer(); private MyHandler mHandler; public static class MyHandler extends Handler { private WeakReference<MainActivity> weakReference; public
MyHandler(MainActivity activity) { weakReference = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { if (weakReference.get() != null) { index++; viewPager.setCurrentItem(index); } super
.handleMessage(msg); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); addListener(); //讓當前圖片位於中間某個位置,目的就是為了開始能夠左滑 viewPager.setCurrentItem(imageIds.length * 100); initRadioButton(imageIds.length);//注意這句和上面那句順序不能寫反,否則會出現第一個圓點無法顯示選中狀態 startSwitch(); } /** * 初始化控制元件 */ public void initView() { viewPager = (ViewPager) findViewById(R.id.viewpager); group = (RadioGroup) findViewById(R.id.group); } /** * 初始化資料 */ public void initData() { mList = new ArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler = new MyHandler(this); } /** * 新增監聽 */ public void addListener() { viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** * 進行圖片輪播 */ public void startSwitch() { //執行定時任務 timer.schedule(new TimerTask() { @Override public void run() { //首先判斷是否需要輪播,是的話我們才發訊息 if (isContinue) { mHandler.sendEmptyMessage(1); } } }, 3000, 3500);//延遲3秒,每隔3.5秒發一次訊息; } /** * 根據圖片個數初始化按鈕 * @param length 圖片所在集合長度 */ private void initRadioButton(int length) { for (int i = 0; i < length; i++) { ImageView imageview = new ImageView(this); imageview.setImageResource(R.drawable.rg_selector);//設定背景選擇器 imageview.setPadding(20, 0, 0, 0);//設定每個按鈕之間的間距 //將按鈕依次新增到RadioGroup中 group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); //預設選中第一個按鈕,因為預設顯示第一張圖片 group.getChildAt(0).setEnabled(false); } } /** * 根據當前觸控事件判斷是否要輪播 */ View.OnTouchListener onTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { //手指按下和划動的時候停止圖片的輪播 case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: isContinue = false; break; default: isContinue = true; } return false;//注意這裡只能返回false,如果返回true,Dwon就會消費掉事件,MOVE無法獲得事件, // 導致圖片無法滑動 } }; /** * 根據當前選中的頁面設定按鈕的選中 */ ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { index = position;//當前位置賦值給索引 setCurrentDot(index % imageIds.length);//因為只有四個按鈕,所以我們在此要對長度區域,保證範圍在0到4 } @Override public void onPageScrollStateChanged(int state) { } }; /** * 設定對應位置按鈕的狀態 * @param i 當前位置 */ private void setCurrentDot(int i) { if (group.getChildAt(i) != null) { group.getChildAt(i).setEnabled(false);//當前按鈕選中,顯示藍色 } if (group.getChildAt(preIndex) != null) { group.getChildAt(preIndex).setEnabled(true);//上一個取消選中。顯示灰色 preIndex = i;//當前位置變為上一個,繼續下次輪播 } } PagerAdapter pagerAdapter = new PagerAdapter() { @Override public int getCount() { //返回一個比較大的值,目的是為了實現無限輪播 return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { position = position % imageIds.length;//因為position非常大,而我們需要的position不能大於圖片集合長度 //所以在此取餘 ImageView imageView = new ImageView(MainActivity.this); imageView.setImageResource(imageIds[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(imageView); mList.add(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // 注意在此不要做任何操作,因為我們需要實現向左滑動,否則會產生IndexOutOfBoundsException } }; @Override protected void onDestroy() { super.onDestroy(); //頁面銷燬的時候取消定時器 if (timer != null) { preIndex = 0; timer.cancel(); } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 2.單向滑動 public class MainActivity extends AppCompatActivity { private static ViewPager viewPager; private RadioGroup group; //圖片資源,實際專案需要從網路獲取 private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawable.ym4}; //存放圖片的陣列 private List<ImageView> mList; //當前索引位置以及上一個索引位置 private static int index = 0, preIndex = 0; //是否需要輪播標誌 private boolean isContinue = true; //定時器,用於實現輪播 private Timer timer = new Timer(); private MyHandler mHandler; public static class MyHandler extends Handler { private WeakReference<MainActivity> weakReference; public MyHandler(MainActivity activity) { weakReference = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { if (weakReference.get() != null) { index++; viewPager.setCurrentItem(index); } super.handleMessage(msg); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); addListener(); initRadioButton(imageIds.length); startSwitch(); } /** * 初始化控制元件 */ public void initView() { viewPager = (ViewPager) findViewById(R.id.viewpager); group = (RadioGroup) findViewById(R.id.group); } /** * 初始化資料 */ public void initData() { mList = new ArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler = new MyHandler(this); } /** * 新增監聽 */ public void addListener() { viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** * 進行圖片輪播 */ public void startSwitch() { //執行定時任務 timer.schedule(new TimerTask() { @Override public void run() { //首先判斷是否需要輪播,是的話我們才發訊息 if (isContinue) { mHandler.sendEmptyMessage(1); } } }, 3000, 3500);//延遲3秒,每隔3.5秒發一次訊息; } /** * 根據圖片個數初始化按鈕 * @param length 圖片所在集合長度 */ private void initRadioButton(int length) { for (int i = 0; i < length; i++) { ImageView imageview = new ImageView(this); imageview.setImageResource(R.drawable.rg_selector);//設定背景選擇器 imageview.setPadding(20, 0, 0, 0);//設定每個按鈕之間的間距 //將按鈕依次新增到RadioGroup中 group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); //預設選中第一個按鈕,因為預設顯示第一張圖片 group.getChildAt(0).setEnabled(false); } } /** * 根據當前觸控事件判斷是否要輪播 */ View.OnTouchListener onTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { //手指按下和划動的時候停止圖片的輪播 case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: isContinue = false; break; default: isContinue = true; } return false;//注意這裡只能返回false,如果返回true,Dwon就會消費掉事件,MOVE無法獲得事件, // 導致圖片無法滑動 } }; /** * 根據當前選中的頁面設定按鈕的選中 */ ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { index = position;//當前位置賦值給索引 setCurrentDot(index % imageIds.length);//因為只有四個按鈕,所以我們在此要對長度區域,保證範圍在0到4 } @Override public void onPageScrollStateChanged(int state) { } }; /** * 設定對應位置按鈕的狀態 * @param i 當前位置 */ private void setCurrentDot(int i) { if (group.getChildAt(i) != null) { group.getChildAt(i).setEnabled(false);//當前按鈕選中,顯示藍色 } if (group.getChildAt(preIndex) != null) { group.getChildAt(preIndex).setEnabled(true);//上一個取消選中。顯示灰色 preIndex = i;//當前位置變為上一個,繼續下次輪播 } } PagerAdapter pagerAdapter = new PagerAdapter() { @Override public int getCount() { //返回一個比較大的值,目的是為了實現無限輪播 return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { position = position % imageIds.length;//因為position非常大,而我們需要的position不能大於圖片集合長度 //所以在此取餘 ImageView imageView = new ImageView(MainActivity.this); imageView.setImageResource(imageIds[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(imageView); mList.add(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mList.get(position)); } }; @Override protected void onDestroy() { super.onDestroy(); //頁面銷燬的時候取消定時器 if (timer != null) { preIndex = 0; index = 0; timer.cancel(); } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 3.加入一張圖片的判斷(最終版) public class MainActivity extends AppCompatActivity { private static ViewPager viewPager; private RadioGroup group; //圖片資源,實際專案需要從網路獲取 // private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawable.ym4}; private int[] imageIds = {R.drawable.ym1}; //存放圖片的陣列 private List<ImageView> mList; //當前索引位置以及上一個索引位置 private static int index = 0, preIndex = 0; //是否需要輪播標誌 private boolean isContinue = true; //定時器,用於實現輪播 private Timer timer = new Timer(); private MyHandler mHandler; public static class MyHandler extends Handler { private WeakReference<MainActivity> weakReference; public MyHandler(MainActivity activity) { weakReference = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { if (weakReference.get() != null) { index++; viewPager.setCurrentItem(index); } super.handleMessage(msg); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); addListener(); initRadioButton(imageIds.length);//注意這句和上面那句順序不能寫反,否則會出現第一個圓點無法顯示選中狀態 startSwitch(); } /** * 初始化控制元件 */ public void initView() { viewPager = (ViewPager) findViewById(R.id.viewpager); group = (RadioGroup) findViewById(R.id.group); } /** * 初始化資料 */ public void initData() { mList = new ArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler = new MyHandler(this); } /** * 新增監聽 */ public void addListener() { viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** * 進行圖片輪播 */ public void startSwitch() { //執行定時任務 timer.schedule(new TimerTask() { @Override public void run() { //首先判斷是否需要輪播,是的話我們才發訊息 if (isContinue) { if(imageIds.length!=1)//多於一張圖片才輪播 mHandler.sendEmptyMessage(1); } } }, 3000, 3500);//延遲3秒,每隔3.5秒發一次訊息; } /** * 根據圖片個數初始化按鈕 * @param length 圖片所在集合長度 */ private void initRadioButton(int length) { for (int i = 0; i < length; i++) { ImageView imageview = new ImageView(this); if(length == 1){ imageview.setVisibility(View.GONE); return; } imageview.setImageResource(R.drawable.rg_selector);//設定背景選擇器 imageview.setPadding(20, 0, 0, 0);//設定每個按鈕之間的間距 //將按鈕依次新增到RadioGroup中 group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); //預設選中第一個按鈕,因為預設顯示第一張圖片 group.getChildAt(0).setEnabled(false); } } /** * 根據當前觸控事件判斷是否要輪播 */ View.OnTouchListener onTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { //手指按下和划動的時候停止圖片的輪播 case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: isContinue = false; break; default: isContinue = true; } if(imageIds.length == 1){ return true;//1張圖片不允許滑動 } return false;//注意這裡只能返回false,如果返回true,Dwon就會消費掉事件,MOVE無法獲得事件, // 導致圖片無法滑動 } }; /** * 根據當前選中的頁面設定按鈕的選中 */ ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { index = position;//當前位置賦值給索引 setCurrentDot(index % imageIds.length);//因為只有四個按鈕,所以我們在此要對長度區域,保證範圍在0到4 } @Override public void onPageScrollStateChanged(int state) { } }; /** * 設定對應位置按鈕的狀態 * @param i 當前位置 */ private void setCurrentDot(int i) { if (group.getChildAt(i) != null) { group.getChildAt(i).setEnabled(false);//當前按鈕選中,顯示藍色 } if (group.getChildAt(preIndex) != null) { group.getChildAt(preIndex).setEnabled(true);//上一個取消選中。顯示灰色 preIndex = i;//當前位置變為上一個,繼續下次輪播 } } PagerAdapter pagerAdapter = new PagerAdapter() { @Override public int getCount() { //返回一個比較大的值,目的是為了實現無限輪播 return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { position = position % imageIds.length;//因為position非常大,而我們需要的position不能大於圖片集合長度 //所以在此取餘 ImageView imageView = new ImageView(MainActivity.this); imageView.setImageResource(imageIds[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(imageView); mList.add(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // 注意在此不要做任何操作,因為我們需要實現向左滑動,否則會產生IndexOutOfBoundsException container.removeView(mList.get(position)); } }; @Override protected void onDestroy() { super.onDestroy(); //頁面銷燬的時候取消定時器 if (timer != null) { preIndex = 0; index = 0; timer.cancel(); } } }