天天看點

android 自定義文字跑馬燈 支援拖拽,按住停止滾動,自定義速度

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 &gt; 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像素,這是我調試之後感覺比較平滑的一個速度。如果代碼有什麼錯誤或者可以改進的地方,希望你們能在評論中指出。謝謝!