android的textview自帶跑馬燈效果,一般使用足夠了。不過也有不一般的情況,是以我實作了一個自定義textview控件,用來針對這種不一般情況下的跑馬燈效果實作。
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
<code>import</code> <code>android.content.Context;</code>
<code>import</code> <code>android.util.AttributeSet;</code>
<code>import</code> <code>android.view.GestureDetector;</code>
<code>import</code> <code>android.view.MotionEvent;</code>
<code>import</code> <code>android.view.View;</code>
<code>import</code> <code>android.view.GestureDetector.OnGestureListener;</code>
<code>import</code> <code>android.view.View.OnTouchListener;</code>
<code>import</code> <code>android.widget.TextView;</code>
<code>/**</code>
<code> </code><code>* 自定義跑馬燈文本框,支援拖拽檢視文本内容,點選暫停文字 先設定要顯示文本,然後調用Start()方法運作跑馬燈</code>
<code> </code><code>*</code>
<code> </code><code>* @author sy</code>
<code> </code><code>*/</code>
<code>public</code>
<code>class</code> <code>MarqueeTextView</code><code>extends</code>
<code>TextView</code><code>implements</code>
<code>Runnable,</code>
<code> </code><code>OnTouchListener {</code>
<code> </code><code>public</code>
<code>MarqueeTextView(Context context) {</code>
<code> </code><code>super</code><code>(context);</code>
<code> </code><code>}</code>
<code> </code><code>/** 是否停止滾動 */</code>
<code> </code><code>private</code>
<code>boolean</code> <code>mStopMarquee;</code>
<code>String mText;</code>
<code>int</code> <code>mCoordinateX;</code>
<code> </code><code>int</code>
<code>xOffset;</code>
<code>int</code> <code>mTextWidth;</code>
<code> </code><code>GestureDetector gestureDetector;</code>
<code>MarqueeTextView(Context context, AttributeSet attrs) {</code>
<code> </code><code>super</code><code>(context, attrs);</code>
<code>MarqueeTextView(Context context, AttributeSet attrs,</code><code>int</code>
<code>defStyle) {</code>
<code> </code><code>super</code><code>(context, attrs, defStyle);</code>
<code> </code><code>/**</code>
<code> </code><code>* 開始滾動</code>
<code> </code><code>*</code>
<code> </code><code>* @param text</code>
<code> </code><code>*/</code>
<code>void</code> <code>Start() {</code>
<code> </code><code>this</code><code>.setOnTouchListener(</code><code>this</code><code>);</code>
<code> </code><code>gestureDetector =</code><code>new</code>
<code>GestureDetector(getContext(),</code>
<code> </code><code>new</code>
<code>OnGestureListener() {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code>
<code>boolean</code> <code>onSingleTapUp(MotionEvent e) {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>return</code>
<code>false</code><code>;</code>
<code> </code><code>}</code>
<code>void</code> <code>onShowPress(MotionEvent e) {</code>
<code>boolean</code> <code>onScroll(MotionEvent e1, MotionEvent e2,</code>
<code> </code><code>float</code>
<code>distanceX,</code><code>float</code>
<code>distanceY) {</code>
<code> </code><code>mCoordinateX += (</code><code>int</code><code>) distanceX;</code>
<code> </code><code>scrollTo(mCoordinateX,</code><code>0</code><code>);</code>
<code> </code><code>// TODO:設定偏移量,distanceX為滑動距離</code>
<code>true</code><code>;</code>
<code>void</code> <code>onLongPress(MotionEvent e) {</code>
<code>boolean</code> <code>onFling(MotionEvent e1, MotionEvent e2,</code>
<code>velocityX,</code><code>float</code>
<code>velocityY) {</code>
<code>boolean</code> <code>onDown(MotionEvent e) {</code>
<code> </code><code>});</code>
<code> </code><code>xOffset =</code><code>0</code><code>;</code>
<code> </code><code>mStopMarquee =</code><code>false</code><code>;</code>
<code> </code><code>mText =</code><code>this</code><code>.getText().toString();</code><code>// 擷取文本框文本</code>
<code> </code><code>mCoordinateX =</code><code>0</code><code>;</code>
<code> </code><code>mTextWidth = (</code><code>int</code><code>) Math.abs(getPaint().measureText(mText));</code>
<code> </code><code>post(</code><code>this</code><code>);</code>
<code> </code><code>@Override</code>
<code>void</code> <code>run() {</code>
<code> </code><code>if</code>
<code>(!mStopMarquee) {</code>
<code> </code><code>mCoordinateX +=</code><code>3</code><code>;</code><code>// 滾動速度</code>
<code> </code><code>scrollTo(mCoordinateX,</code><code>0</code><code>);</code>
<code> </code><code>if</code>
<code>(mCoordinateX > mTextWidth) {</code>
<code> </code><code>scrollTo(</code><code>0</code><code>,</code><code>0</code><code>);</code>
<code> </code><code>mCoordinateX =</code><code>0</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>postDelayed(</code><code>this</code><code>,</code><code>50</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>// 繼續滾動</code>
<code>void</code> <code>Continue() {</code>
<code>(mStopMarquee) {</code>
<code> </code><code>mStopMarquee =</code><code>false</code><code>;</code>
<code> </code><code>post(</code><code>this</code><code>);</code>
<code> </code><code>// 暫停滾動</code>
<code>void</code> <code>Paush() {</code>
<code> </code><code>mStopMarquee =</code><code>true</code><code>;</code>
<code>boolean</code> <code>onTouch(View v, MotionEvent event) {</code>
<code> </code><code>switch</code>
<code>(event.getAction()) {</code>
<code> </code><code>case</code>
<code>MotionEvent.ACTION_DOWN:</code>
<code>MotionEvent.ACTION_MOVE:</code>
<code>MotionEvent.ACTION_SCROLL:</code>
<code> </code><code>Paush();</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>default</code><code>:</code>
<code> </code><code>Continue();</code>
<code> </code><code>gestureDetector.onTouchEvent(event);</code>
<code> </code><code>return</code>
<code>}</code>
首先調用setText設定文本内容,然後調用start()開始滾動。滾動速度為每50毫米移動3像素,這是我調試之後感覺比較平滑的一個速度。如果代碼有什麼錯誤或者可以改進的地方,希望你們能在評論中指出。謝謝!