天天看點

android 字型跑馬燈,Android文字跑馬燈功能的實作(自定義跑馬燈控件)

文字跑馬燈效果這個功能挺常見的,網上也有很多的介紹,大多是說使用普通的TextView加上幾條屬性即可實作。不過我在使用時發現并不能實作滾動,可能是因為我的頁面中使用到的布局及控件比較複雜,被别的控件搶占了焦點,不願再折騰,故放棄了原生TextView實作此功能的方式。下面是我在參考了以前項目中使用的一個自定義View,這裡分享出來,供大家參考。

1. 繼承TextView實作自定義跑馬燈布局的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;//是否停止滾動

private String mText;//文本内容

private float mCoordinateX = 800;//目前滾動位置

private float mCoordinateY = 150;//目前滾動位置

private float mTextWidth;//文本寬度

private int mScrollWidth = 800;//滾動區域寬度

private int speed = 1;//滾動速度

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)) {

//文字滾動完了,從滾動區域的右邊出來

mCoordinateX = mScrollWidth;

invalidate();

if (!mStopMarquee) {

sendEmptyMessageDelayed(0, 500);

}

} else {

mCoordinateX -= speed;

invalidate();

if (!mStopMarquee) {

sendEmptyMessageDelayed(0, 30);

}

}

break;

}

super.handleMessage(msg);

}

};

}

2. 布局檔案:

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);//設定滾動區域位置:在左邊距400像素,頂邊距10像素的位置

LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(margin1);

layoutParams1.height = 160;//設滾動區域高度

layoutParams1.width = 800; //設定滾動區域寬度

marqueeTextView.setLayoutParams(layoutParams1);

marqueeTextView.setScrollWidth(800);

marqueeTextView.setCoordinateY(150);

marqueeTextView.setCurrentPosition(800);//設定滾動資訊從滾動區域的右邊出來

marqueeTextView.setSpeed(1);

marqueeTextView.setText("我是滾動字幕啊12345,我是滾動字幕啊12345,我是滾動字幕啊12345,我是滾動字幕啊12345,我是滾動字幕啊12345,我是滾動字幕啊12345,我是滾動字幕啊12345,我是滾動字幕啊12345");

在此處最重要的是設定好文字的寬度、高度以及顯示位置等,set相應的屬性即可實作自己想要的滾動字幕效果!

以上就是Android中文字跑馬燈功能的實作執行個體,希望本文對大家學習Android開發有所幫助。