Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android實現圖片自動輪播並且支持手勢左右無限滑動

Android實現圖片自動輪播並且支持手勢左右無限滑動

編輯:關於Android編程

廢話不多說了,先給大家上左右無限滑動的代碼了。

1.左右無限滑動

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();
}
}
}

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();
}
}
}

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();
}
}
}

以上所述是小編給大家介紹的Android實現圖片自動輪播並且支持手勢左右無限滑動,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對本站網站的支持!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved