Android文字跑馬燈功能的實(shí)現(xiàn)(自定義跑馬燈控件)

文字跑馬燈效果這個(gè)功能挺常見的,網(wǎng)上也有很多的介紹,大多是說使用普通的TextView加上幾條屬性即可實(shí)現(xiàn)。不過我在使用時(shí)發(fā)現(xiàn)并不能實(shí)現(xiàn)滾動(dòng),可能是因?yàn)槲业捻撁嬷惺褂玫降牟季旨翱丶容^復(fù)雜,被別的控件搶占了焦點(diǎn),不愿再折騰,故放棄了原生TextView實(shí)現(xiàn)此功能的方式。下面是我在參考了以前項(xiàng)目中使用的一個(gè)自定義View,這里分享出來,供大家參考。

1. 繼承TextView實(shí)現(xiàn)自定義跑馬燈布局的MarqueeTextView類

        package com.ui.custom.view;
        
        import android.content.Context;
        import android.graphics.Canvas;
        import android.os.Handler;
        import android.os.Message;
        import android.util.AttributeSet;
        import android.widget.TextView;
        
        public class MarqueeTextView extends TextView {
        
            private boolean mStopMarquee;//是否停止?jié)L動(dòng)
            private String mText;//文本內(nèi)容
            private float mCoordinateX = 800;//當(dāng)前滾動(dòng)位置
            private float mCoordinateY = 150;//當(dāng)前滾動(dòng)位置
            private float mTextWidth;//文本寬度
            private int mScrollWidth = 800;//滾動(dòng)區(qū)域?qū)挾?            private int speed = 1;//滾動(dòng)速度
        
            public float getCurrentPosition() {
                return mCoordinateX;
            }
        
            public void setCurrentPosition(float mCoordinateX) {
                this.mCoordinateX = mCoordinateX;
            }
        
            public float getCoordinateY() {
                return mCoordinateY;
            }
        
            public void setCoordinateY(float mCoordinateY) {
                this.mCoordinateY = mCoordinateY;
            }
        
            public int getScrollWidth() {
                return mScrollWidth;
            }
        
            public void setScrollWidth(int mScrollWidth) {
                this.mScrollWidth = mScrollWidth;
            }
        
            public int getSpeed() {
                return speed;
            }
        
            public void setSpeed(int speed) {
                this.speed = speed;
            }
        
            public MarqueeTextView(Context context, AttributeSet attrs) {
                super(context, attrs);
            }
        
            public void setText(String text) {
                this.mText = text;
                mTextWidth = getPaint().measureText(mText);
                //mTextWidth = 1280;
                if (mHandler.hasMessages(0))
                    mHandler.removeMessages(0);
                mHandler.sendEmptyMessageDelayed(0, 10);
            }
        
            @Override
            protected void onAttachedToWindow() {
                mStopMarquee = false;
                if (!isEmpty(mText))
                    mHandler.sendEmptyMessageDelayed(0, 2000);
                super.onAttachedToWindow();
            }
        
            public static boolean isEmpty(String str) {
                return str == null || str.length() == 0;
            }
        
            @Override
            protected void onDetachedFromWindow() {
                mStopMarquee = true;
                if (mHandler.hasMessages(0))
                    mHandler.removeMessages(0);
                super.onDetachedFromWindow();
            }
        
            @Override
            protected void onDraw(Canvas canvas) {
                super.onDraw(canvas);
                if (!isEmpty(mText))
                    canvas.drawText(mText, mCoordinateX, mCoordinateY, getPaint());
            }
        
            private Handler mHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    switch (msg.what) {
                        case 0:
                            if (mCoordinateX < (-mTextWidth)) {
                                //文字滾動(dòng)完了,從滾動(dòng)區(qū)域的右邊出來
                                mCoordinateX = mScrollWidth;
                                invalidate();
                                if (!mStopMarquee) {
                                    sendEmptyMessageDelayed(0, 500);
                                }
                            } else {
                                mCoordinateX -= speed;
                                invalidate();
                                if (!mStopMarquee) {
                                    sendEmptyMessageDelayed(0, 30);
                                }
                            }
        
                            break;
                    }
                    super.handleMessage(msg);
                }
            };
        
        }

2. 布局文件:

    <com.ui.custom.view.MarqueeTextView
        android:id="@+id/tv_scroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_weight="1"
        android:textColor="@android:color/white"
        android:textSize="30sp" />

3. 在Activity中使用的代碼

        private MarqueeTextView marqueeTextView;

        marqueeTextView = (MarqueeTextView)findViewById(R.id.tv_scroll);
        
        ViewGroup.MarginLayoutParams margin1 = new ViewGroup.MarginLayoutParams(
                marqueeTextView.getLayoutParams());
        margin1.setMargins(283, 0, 0, 0);//設(shè)置滾動(dòng)區(qū)域位置:在左邊距400像素,頂邊距10像素的位置
        LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(margin1);
        layoutParams1.height = 160;//設(shè)滾動(dòng)區(qū)域高度
        layoutParams1.width = 800; //設(shè)置滾動(dòng)區(qū)域?qū)挾?        
        marqueeTextView.setLayoutParams(layoutParams1);
        marqueeTextView.setScrollWidth(800);
        marqueeTextView.setCoordinateY(150);
        marqueeTextView.setCurrentPosition(800);//設(shè)置滾動(dòng)信息從滾動(dòng)區(qū)域的右邊出來
        marqueeTextView.setSpeed(1);
        
        marqueeTextView.setText("我是滾動(dòng)字幕啊12345,我是滾動(dòng)字幕啊12345,我是滾動(dòng)字幕啊12345,我是滾動(dòng)字幕啊12345,我是滾動(dòng)字幕啊12345,我是滾動(dòng)字幕啊12345,我是滾動(dòng)字幕啊12345,我是滾動(dòng)字幕啊12345");

在此處最重要的是設(shè)置好文字的寬度、高度以及顯示位置等,set相應(yīng)的屬性即可實(shí)現(xiàn)自己想要的滾動(dòng)字幕效果!
以上就是Android中文字跑馬燈功能的實(shí)現(xiàn)實(shí)例,希望本文對(duì)大家學(xué)習(xí)Android開發(fā)有所幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,964評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,354評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,554評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,918評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,093評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,342評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評(píng)論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,839評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,107評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,678評(píng)論 25 708
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,856評(píng)論 22 665
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,489評(píng)論 0 17
  • C語言庫函數(shù)的原理: atoi:字符串轉(zhuǎn)換為整形 (符號(hào)和空格的處理,異常的處理) itoa:整形轉(zhuǎn)換為字符串(使...
    阿立94s閱讀 412評(píng)論 0 0
  • 今日家庭: 昨晚從武漢回來很晚,2點(diǎn)鐘快睡覺的,今天早晨6點(diǎn)20分被鬧鐘叫醒的,熬夜了之后再早起非常痛苦的頭暈?zāi)X脹...
    周秀峰閱讀 203評(píng)論 0 1