文字跑馬燈效果這個(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ā)有所幫助。