天天看点

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像素,这是我调试之后感觉比较平滑的一个速度。如果代码有什么错误或者可以改进的地方,希望你们能在评论中指出。谢谢!