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

import android.content.Context;

import android.util.AttributeSet;

import android.view.GestureDetector;

import android.view.MotionEvent;

import android.view.View;

import android.view.GestureDetector.OnGestureListener;

import android.view.View.OnTouchListener;

import android.widget.TextView;

/**

 * 自定义跑马灯文本框,支持拖拽查看文本内容,点击暂停文字 先设置要显示文本,然后调用Start()方法运行跑马灯

 *

 * @author sy

 */

public
class MarqueeTextView extends
TextView implements
Runnable,

        OnTouchListener {

    public
MarqueeTextView(Context context) {

        super(context);

    }

    /** 是否停止滚动 */

    private
boolean mStopMarquee;

    private
String mText;

    public
int mCoordinateX;

    int
xOffset;

    private
int mTextWidth;

    GestureDetector gestureDetector;

    public
MarqueeTextView(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

    public
MarqueeTextView(Context context, AttributeSet attrs, int
defStyle) {

        super(context, attrs, defStyle);

    }

    /**

     * 开始滚动

     *

     * @param text

     */

    public
void Start() {

        this.setOnTouchListener(this);

        gestureDetector = new
GestureDetector(getContext(),

                new
OnGestureListener() {

                    @Override

                    public
boolean onSingleTapUp(MotionEvent e) {

                        // TODO Auto-generated method stub

                        return
false;

                    }

                    @Override

                    public
void onShowPress(MotionEvent e) {

                        // TODO Auto-generated method stub

                    }

                    @Override

                    public
boolean onScroll(MotionEvent e1, MotionEvent e2,

                            float
distanceX, float
distanceY) {

                        mCoordinateX += (int) distanceX;

                        scrollTo(mCoordinateX, 0);

                        // TODO:设置偏移量,distanceX为滑动距离

                        return
true;

                    }

                    @Override

                    public
void onLongPress(MotionEvent e) {

                        // TODO Auto-generated method stub

                    }

                    @Override

                    public
boolean onFling(MotionEvent e1, MotionEvent e2,

                            float
velocityX, float
velocityY) {

                        return
false;

                    }

                    @Override

                    public
boolean onDown(MotionEvent e) {

                        // TODO Auto-generated method stub

                        return
false;

                    }

                });

        xOffset = 0;

        mStopMarquee = false;

        mText = this.getText().toString();// 获取文本框文本

        mCoordinateX = 0;

        mTextWidth = (int) Math.abs(getPaint().measureText(mText));

        post(this);

    }

    @Override

    public
void run() {

        if
(!mStopMarquee) {

            mCoordinateX += 3;// 滚动速度

            scrollTo(mCoordinateX, 0);

            if
(mCoordinateX > mTextWidth) {

                scrollTo(0, 0);

                mCoordinateX = 0;

            }

            postDelayed(this, 50);

        }

    }

    // 继续滚动

    public
void Continue() {

        if
(mStopMarquee) {

            mStopMarquee = false;

            post(this);

        }

    }

    // 暂停滚动

    public
void Paush() {

        mStopMarquee = true;

    }

    @Override

    public
boolean onTouch(View v, MotionEvent event) {

        switch
(event.getAction()) {

        case
MotionEvent.ACTION_DOWN:

        case
MotionEvent.ACTION_MOVE:

        case
MotionEvent.ACTION_SCROLL:

            Paush();

            break;

        default:

            Continue();

            break;

        }

        gestureDetector.onTouchEvent(event);

        return
true;

    }

}

  首先调用setText设置文本内容,然后调用start()开始滚动。滚动速度为每50毫米移动3像素,这是我调试之后感觉比较平滑的一个速度。如果代码有什么错误或者可以改进的地方,希望你们能在评论中指出。谢谢!

时间: 2024-08-04 18:32:20

android 自定义文字跑马灯 支持拖拽,按住停止滚动,自定义速度的相关文章

Android文字跑马灯控件(文本自动滚动控件)

最近在开发一个应用,需要用到文本的跑马灯效果,图省事,在网上找,但老半天都找不到,后来自己写了一个,很简单,代码如下: import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; impor

Android:TextView文字跑马灯的效果实现

解决TextView文字显示不全的问题. 简单设置跑马灯的效果: <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:focusable="true" androi

jQuery+CSS3文字跑马灯特效

jQuery+CSS3文字跑马灯特效是一款将跑马灯背景制作为3D立方体效果,文字在上面移动时,就像是文字投影到墙壁上,在转角出会改变运动方向. 效果展示 http://hovertree.com/texiao/jquery/83/ 效果图如下: 完整HTML代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta http

android TextView实现跑马灯效果(字体滚动)

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" androi

Qt无边框窗体-最大化时支持拖拽还原

目录 一.概述 二.效果展示 三.demo制作 1.设计窗体 2.双击放大 四.拖拽 五.相关文章 原文链接:Markdown模板 一.概述 用Qt进行开发界面时,既想要实现友好的用户交互又想界面漂亮,那么自定义界面就必不可少.其中有一个操作就是是我们每一个Qter开发者都要会的,而且是经常进行的. Qt::FramelessWindowHint这个属性想必大家都使用过,有些同学可能对这个属性很了解,也用的是炉火纯青,今天我们也来说说这个属性. 关于这个无边框属性网上也有一些文章,有些谈论的是b

jQuery插件之路(三)——文件上传(支持拖拽上传)

好了,这次咱一改往日的作风,就不多说废话了,哈哈.先贴上源代码地址,点击获取.然后直接进入主题啦,当然,如果你觉得我有哪里写的不对或者欠妥的地方,欢迎留言指出.在附上一些代码之前,我们还是先来了解下,上传文件的时候需要利用的一些必要的知识. 首先我们要说的就是FileReader对象,这是一个HTML5提出的,专门用来异步的读取用户计算机上文件的对象,这里有详细的介绍.所以如果我们想要使用它,那么首先我们得先创建一个FileReader对象. var fr = new FileReader()

Delphi 文字跑马灯

1 //跑马灯 2 procedure Tfr_Main.tme_TitleTimer(Sender: TObject); 3 var 4 strTrim: Widestring; 5 begin 6 strTrim := copy(strScroll, 1, 1); // 获取第1个字符 7 Delete(strScroll, 1, 1); // 将第1个字符删除 8 strScroll := strScroll + strTrim; // 将原来第1个字符放到最后一位 9 Applicati

基于html5可拖拽图片循环滚动切换

分享一款基于html5可拖拽图片循环滚动切换.这是一款支持手机端拖拽切换的网站图片循环滚动特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="site-wrapper"> <section id="section-header" data-coloroverlap="dark"></section> <section id="second-phase&qu

android textview 实现跑马灯效果

跑马灯效果最重要的就是四个属性,分别是: android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:singleLine="true" 控件的宽度,不一定是具体的值,可以是math_parent,如果想让textview中的文字滚动的话,那里面内容的长度肯定是要大于控件的长度的,不然滚动还有啥