文字跑馬燈效果這個功能挺常見的,網上也有很多的介紹,大多是說使用普通的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開發有所幫助。