ViewPager圖片橫向自動輪播方法2
阿新 • • 發佈:2019-01-30
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();
}
}
}