Android實(shí)現(xiàn)圖片自動(dòng)輪播并且支持手勢左右無限滑動(dòng)
廢話不多說了,先給大家上左右無限滑動(dòng)的代碼了。
1.左右無限滑動(dòng)
public class MainActivity extends AppCompatActivity { private static ViewPager viewPager; private RadioGroup group; //圖片資源,實(shí)際項(xiàng)目需要從網(wǎng)絡(luò)獲取 private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawable.ym4}; //存放圖片的數(shù)組 private List<ImageView> mList; //當(dāng)前索引位置以及上一個(gè)索引位置 private static int index = 0, preIndex = 0; //是否需要輪播標(biāo)志 private boolean isContinue = true; //定時(shí)器,用于實(shí)現(xiàn)輪播 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(); //讓當(dāng)前圖片位于中間某個(gè)位置,目的就是為了開始能夠左滑 viewPager.setCurrentItem(imageIds.length * 100); initRadioButton(imageIds.length);//注意這句和上面那句順序不能寫反,否則會(huì)出現(xiàn)第一個(gè)圓點(diǎn)無法顯示選中狀態(tài) startSwitch(); } /** * 初始化控件 */ public void initView() { viewPager = (ViewPager) findViewById(R.id.viewpager); group = (RadioGroup) findViewById(R.id.group); } /** * 初始化數(shù)據(jù) */ public void initData() { mList = new ArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler = new MyHandler(this); } /** * 添加監(jiān)聽 */ public void addListener() { viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** * 進(jìn)行圖片輪播 */ public void startSwitch() { //執(zhí)行定時(shí)任務(wù) timer.schedule(new TimerTask() { @Override public void run() { //首先判斷是否需要輪播,是的話我們才發(fā)消息 if (isContinue) { mHandler.sendEmptyMessage(1); } } }, 3000, 3500);//延遲3秒,每隔3.5秒發(fā)一次消息; } /** * 根據(jù)圖片個(gè)數(shù)初始化按鈕 * @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);//設(shè)置背景選擇器 imageview.setPadding(20, 0, 0, 0);//設(shè)置每個(gè)按鈕之間的間距 //將按鈕依次添加到RadioGroup中 group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); //默認(rèn)選中第一個(gè)按鈕,因?yàn)槟J(rèn)顯示第一張圖片 group.getChildAt(0).setEnabled(false); } } /** * 根據(jù)當(dāng)前觸摸事件判斷是否要輪播 */ View.OnTouchListener onTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { //手指按下和劃動(dòng)的時(shí)候停止圖片的輪播 case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: isContinue = false; break; default: isContinue = true; } return false;//注意這里只能返回false,如果返回true,Dwon就會(huì)消費(fèi)掉事件,MOVE無法獲得事件, // 導(dǎo)致圖片無法滑動(dòng) } }; /** * 根據(jù)當(dāng)前選中的頁面設(shè)置按鈕的選中 */ ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { index = position;//當(dāng)前位置賦值給索引 setCurrentDot(index % imageIds.length);//因?yàn)橹挥兴膫€(gè)按鈕,所以我們在此要對(duì)長度區(qū)域,保證范圍在0到4 } @Override public void onPageScrollStateChanged(int state) { } }; /** * 設(shè)置對(duì)應(yīng)位置按鈕的狀態(tài) * @param i 當(dāng)前位置 */ private void setCurrentDot(int i) { if (group.getChildAt(i) != null) { group.getChildAt(i).setEnabled(false);//當(dāng)前按鈕選中,顯示藍(lán)色 } if (group.getChildAt(preIndex) != null) { group.getChildAt(preIndex).setEnabled(true);//上一個(gè)取消選中。顯示灰色 preIndex = i;//當(dāng)前位置變?yōu)樯弦粋€(gè),繼續(xù)下次輪播 } } PagerAdapter pagerAdapter = new PagerAdapter() { @Override public int getCount() { //返回一個(gè)比較大的值,目的是為了實(shí)現(xiàn)無限輪播 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;//因?yàn)閜osition非常大,而我們需要的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) { // 注意在此不要做任何操作,因?yàn)槲覀冃枰獙?shí)現(xiàn)向左滑動(dòng),否則會(huì)產(chǎn)生IndexOutOfBoundsException } }; @Override protected void onDestroy() { super.onDestroy(); //頁面銷毀的時(shí)候取消定時(shí)器 if (timer != null) { preIndex = 0; timer.cancel(); } } }
2.單向滑動(dòng)
public class MainActivity extends AppCompatActivity { private static ViewPager viewPager; private RadioGroup group; //圖片資源,實(shí)際項(xiàng)目需要從網(wǎng)絡(luò)獲取 private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawable.ym4}; //存放圖片的數(shù)組 private List<ImageView> mList; //當(dāng)前索引位置以及上一個(gè)索引位置 private static int index = 0, preIndex = 0; //是否需要輪播標(biāo)志 private boolean isContinue = true; //定時(shí)器,用于實(shí)現(xiàn)輪播 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); } /** * 初始化數(shù)據(jù) */ public void initData() { mList = new ArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler = new MyHandler(this); } /** * 添加監(jiān)聽 */ public void addListener() { viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** * 進(jìn)行圖片輪播 */ public void startSwitch() { //執(zhí)行定時(shí)任務(wù) timer.schedule(new TimerTask() { @Override public void run() { //首先判斷是否需要輪播,是的話我們才發(fā)消息 if (isContinue) { mHandler.sendEmptyMessage(1); } } }, 3000, 3500);//延遲3秒,每隔3.5秒發(fā)一次消息; } /** * 根據(jù)圖片個(gè)數(shù)初始化按鈕 * @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);//設(shè)置背景選擇器 imageview.setPadding(20, 0, 0, 0);//設(shè)置每個(gè)按鈕之間的間距 //將按鈕依次添加到RadioGroup中 group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); //默認(rèn)選中第一個(gè)按鈕,因?yàn)槟J(rèn)顯示第一張圖片 group.getChildAt(0).setEnabled(false); } } /** * 根據(jù)當(dāng)前觸摸事件判斷是否要輪播 */ View.OnTouchListener onTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { //手指按下和劃動(dòng)的時(shí)候停止圖片的輪播 case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: isContinue = false; break; default: isContinue = true; } return false;//注意這里只能返回false,如果返回true,Dwon就會(huì)消費(fèi)掉事件,MOVE無法獲得事件, // 導(dǎo)致圖片無法滑動(dòng) } }; /** * 根據(jù)當(dāng)前選中的頁面設(shè)置按鈕的選中 */ ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { index = position;//當(dāng)前位置賦值給索引 setCurrentDot(index % imageIds.length);//因?yàn)橹挥兴膫€(gè)按鈕,所以我們在此要對(duì)長度區(qū)域,保證范圍在0到4 } @Override public void onPageScrollStateChanged(int state) { } }; /** * 設(shè)置對(duì)應(yīng)位置按鈕的狀態(tài) * @param i 當(dāng)前位置 */ private void setCurrentDot(int i) { if (group.getChildAt(i) != null) { group.getChildAt(i).setEnabled(false);//當(dāng)前按鈕選中,顯示藍(lán)色 } if (group.getChildAt(preIndex) != null) { group.getChildAt(preIndex).setEnabled(true);//上一個(gè)取消選中。顯示灰色 preIndex = i;//當(dāng)前位置變?yōu)樯弦粋€(gè),繼續(xù)下次輪播 } } PagerAdapter pagerAdapter = new PagerAdapter() { @Override public int getCount() { //返回一個(gè)比較大的值,目的是為了實(shí)現(xiàn)無限輪播 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;//因?yàn)閜osition非常大,而我們需要的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(); //頁面銷毀的時(shí)候取消定時(shí)器 if (timer != null) { preIndex = 0; index = 0; timer.cancel(); } } }
3.加入一張圖片的判斷(最終版)
public class MainActivity extends AppCompatActivity { private static ViewPager viewPager; private RadioGroup group; //圖片資源,實(shí)際項(xiàng)目需要從網(wǎng)絡(luò)獲取 // private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawable.ym4}; private int[] imageIds = {R.drawable.ym1}; //存放圖片的數(shù)組 private List<ImageView> mList; //當(dāng)前索引位置以及上一個(gè)索引位置 private static int index = 0, preIndex = 0; //是否需要輪播標(biāo)志 private boolean isContinue = true; //定時(shí)器,用于實(shí)現(xiàn)輪播 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);//注意這句和上面那句順序不能寫反,否則會(huì)出現(xiàn)第一個(gè)圓點(diǎn)無法顯示選中狀態(tài) startSwitch(); } /** * 初始化控件 */ public void initView() { viewPager = (ViewPager) findViewById(R.id.viewpager); group = (RadioGroup) findViewById(R.id.group); } /** * 初始化數(shù)據(jù) */ public void initData() { mList = new ArrayList<>(); viewPager.setAdapter(pagerAdapter); mHandler = new MyHandler(this); } /** * 添加監(jiān)聽 */ public void addListener() { viewPager.addOnPageChangeListener(onPageChangeListener); viewPager.setOnTouchListener(onTouchListener); } /** * 進(jìn)行圖片輪播 */ public void startSwitch() { //執(zhí)行定時(shí)任務(wù) timer.schedule(new TimerTask() { @Override public void run() { //首先判斷是否需要輪播,是的話我們才發(fā)消息 if (isContinue) { if(imageIds.length!=1)//多于一張圖片才輪播 mHandler.sendEmptyMessage(1); } } }, 3000, 3500);//延遲3秒,每隔3.5秒發(fā)一次消息; } /** * 根據(jù)圖片個(gè)數(shù)初始化按鈕 * @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);//設(shè)置背景選擇器 imageview.setPadding(20, 0, 0, 0);//設(shè)置每個(gè)按鈕之間的間距 //將按鈕依次添加到RadioGroup中 group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); //默認(rèn)選中第一個(gè)按鈕,因?yàn)槟J(rèn)顯示第一張圖片 group.getChildAt(0).setEnabled(false); } } /** * 根據(jù)當(dāng)前觸摸事件判斷是否要輪播 */ View.OnTouchListener onTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { //手指按下和劃動(dòng)的時(shí)候停止圖片的輪播 case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: isContinue = false; break; default: isContinue = true; } if(imageIds.length == 1){ return true;//1張圖片不允許滑動(dòng) } return false;//注意這里只能返回false,如果返回true,Dwon就會(huì)消費(fèi)掉事件,MOVE無法獲得事件, // 導(dǎo)致圖片無法滑動(dòng) } }; /** * 根據(jù)當(dāng)前選中的頁面設(shè)置按鈕的選中 */ ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { index = position;//當(dāng)前位置賦值給索引 setCurrentDot(index % imageIds.length);//因?yàn)橹挥兴膫€(gè)按鈕,所以我們在此要對(duì)長度區(qū)域,保證范圍在0到4 } @Override public void onPageScrollStateChanged(int state) { } }; /** * 設(shè)置對(duì)應(yīng)位置按鈕的狀態(tài) * @param i 當(dāng)前位置 */ private void setCurrentDot(int i) { if (group.getChildAt(i) != null) { group.getChildAt(i).setEnabled(false);//當(dāng)前按鈕選中,顯示藍(lán)色 } if (group.getChildAt(preIndex) != null) { group.getChildAt(preIndex).setEnabled(true);//上一個(gè)取消選中。顯示灰色 preIndex = i;//當(dāng)前位置變?yōu)樯弦粋€(gè),繼續(xù)下次輪播 } } PagerAdapter pagerAdapter = new PagerAdapter() { @Override public int getCount() { //返回一個(gè)比較大的值,目的是為了實(shí)現(xiàn)無限輪播 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;//因?yàn)閜osition非常大,而我們需要的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) { // 注意在此不要做任何操作,因?yàn)槲覀冃枰獙?shí)現(xiàn)向左滑動(dòng),否則會(huì)產(chǎn)生IndexOutOfBoundsException container.removeView(mList.get(position)); } }; @Override protected void onDestroy() { super.onDestroy(); //頁面銷毀的時(shí)候取消定時(shí)器 if (timer != null) { preIndex = 0; index = 0; timer.cancel(); } } }
以上所述是小編給大家介紹的Android實(shí)現(xiàn)圖片自動(dòng)輪播并且支持手勢左右無限滑動(dòng),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android 高仿微信朋友圈動(dòng)態(tài)支持雙擊手勢放大并滑動(dòng)查看圖片效果
- Android實(shí)現(xiàn)手勢滑動(dòng)和簡單動(dòng)畫效果
- Android實(shí)現(xiàn)手勢滑動(dòng)多點(diǎn)觸摸放大縮小圖片效果
- Android手勢滑動(dòng)實(shí)現(xiàn)ImageView縮放圖片大小
- Android GestureDetector手勢滑動(dòng)使用實(shí)例講解
- android中view手勢滑動(dòng)沖突的解決方法
- Android自定義View實(shí)現(xiàn)隨手勢滑動(dòng)控件
- Android實(shí)現(xiàn)手勢滑動(dòng)多點(diǎn)觸摸縮放平移圖片效果
- Android實(shí)現(xiàn)手勢滑動(dòng)多點(diǎn)觸摸縮放平移圖片效果(二)
- Android獲取觸摸手勢實(shí)現(xiàn)左右滑動(dòng)
相關(guān)文章
android選項(xiàng)卡TabHost功能用法詳解
這篇文章主要為大家詳細(xì)介紹了android選項(xiàng)卡TabHost的功能用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04解析Android中如何做到Service被關(guān)閉后又自動(dòng)啟動(dòng)的實(shí)現(xiàn)方法
本篇文章是對(duì)在Android中如何做到Service被關(guān)閉后又自動(dòng)啟動(dòng)的方法進(jìn)行了詳細(xì)的分析和介紹。需要的朋友參考下2013-05-05Android性能優(yōu)化之plt?hook與native線程監(jiān)控詳解
這篇文章主要為大家介紹了Android性能優(yōu)化之plt?hook與native線程監(jiān)控詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09安裝時(shí)加入外部數(shù)據(jù)庫示例(android外部數(shù)據(jù)庫)
這篇文章主要介紹了android打包安裝時(shí)加入外部數(shù)據(jù)庫的示例,需要的朋友可以參考下2014-03-03Android中TabLayout+ViewPager 簡單實(shí)現(xiàn)app底部Tab導(dǎo)航欄
TabLayout 是Android com.android.support:design庫的一個(gè)控件。本文主要給大家介紹TabLayout+ViewPager 簡單實(shí)現(xiàn)app底部Tab布局,需要的的朋友參考下2017-02-02Flutter?DateTime日期轉(zhuǎn)換的詳細(xì)使用
本文主要介紹了Flutter?DateTime日期轉(zhuǎn)換的詳細(xì)使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Android判斷App前臺(tái)運(yùn)行還是后臺(tái)運(yùn)行(運(yùn)行狀態(tài))
這篇文章主要介紹了Android判斷App前臺(tái)運(yùn)行還是后臺(tái)運(yùn)行的相關(guān)資料,需要的朋友可以參考下2016-04-04