-
Notifications
You must be signed in to change notification settings - Fork 9
/
AutoVerticalScrollTextViewUtil.java
141 lines (118 loc) · 4.45 KB
/
AutoVerticalScrollTextViewUtil.java
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
package cc.ibooker.ztextviewlib;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 用来管理AutoVerticalScrollTextView
* Created by 邹峰立 on 2017/6/30.
*/
public class AutoVerticalScrollTextViewUtil {
private static final int MESSAGE_CODE = 200;
private long duration = 1000;// 停顿时间毫秒(ms)-默认1s
private MyHandler handler = new MyHandler(this);
private AutoVerticalScrollTextView textView;// 目标TextView
private ExecutorService executorService;// 线程池
private boolean isRunning;// 标记是否为滚动状态
private int number = 0;// 用来记录滚动次数
private int currentPos = 0;// 标记当前显示哪一项
private ArrayList<CharSequence> mDatas = new ArrayList<>();// 需要轮播的数据源
private CharSequence title;// 需要改变TextView上面的文本内容
// 构造方法
public AutoVerticalScrollTextViewUtil(final AutoVerticalScrollTextView textView, ArrayList<CharSequence> datas) {
this.mDatas = datas;
this.textView = textView;
// 控件点击事件监听
this.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ZTextViewClickUtil.isFastClick())
return;
if (onMyClickListener != null)
onMyClickListener.onMyClickListener(currentPos, title);
}
});
}
// 设置停顿时间ms
public AutoVerticalScrollTextViewUtil setDuration(long duration) {
this.duration = duration;
return this;
}
// 开始轮播
public void start() {
isRunning = true;
// 开启线程
startThread();
}
// 关闭轮播
public void stop() {
isRunning = false;
if (executorService != null)
executorService.shutdownNow();
}
// 获取当前运行状态
public boolean getIsRunning() {
return isRunning;
}
// 开启线程
private void startThread() {
// 定义一个执行线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
if (mDatas == null || mDatas.size() <= 0) {
// 当数据源为空的时候,什么都不做
isRunning = false;
} else {
while (isRunning) {
// 获取要显示的数据
currentPos = number % mDatas.size();
title = mDatas.get(currentPos);
number++;
// 改变文本显示
handler.sendEmptyMessage(MESSAGE_CODE);
// 停顿
Thread.sleep(duration);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 线程池进行管理
if (executorService == null || executorService.isShutdown())
executorService = Executors.newSingleThreadScheduledExecutor();
executorService.execute(thread);
}
// 定义Handler修改主线程
private static class MyHandler extends Handler {
// 软引用
private final WeakReference<AutoVerticalScrollTextViewUtil> mUtil;
MyHandler(AutoVerticalScrollTextViewUtil util) {
mUtil = new WeakReference<>(util);
}
@Override
public void handleMessage(Message msg) {
AutoVerticalScrollTextViewUtil currentUtil = mUtil.get();
if (msg.what == MESSAGE_CODE) {
currentUtil.textView.next();
if (!TextUtils.isEmpty(currentUtil.title))
currentUtil.textView.setText(currentUtil.title);
}
}
}
// 点击事件监听
public interface OnMyClickListener {
void onMyClickListener(int position, CharSequence title);
}
private OnMyClickListener onMyClickListener;
public void setOnMyClickListener(OnMyClickListener onMyClickListener) {
this.onMyClickListener = onMyClickListener;
}
}