最近因为项目需要,一直都在寻找比较贴合项目主题的跑马灯,但是写的demo都是可以运行的,但是整合到项目中的时候就不起作用了,看了许多的资料,最后总结这都是线程的问题,后来各种捣腾,终于写出了一个比较合适的跑马灯,整合到项目中也是可以运行的,希望大神能多多指点
自定义一个控件src/MarqueeTextView.java
package com.example.test_marquee;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.Shader.TileMode;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.Display;
import android.view.WindowManager;
import android.widget.TextView;
public class MarqueeTextView extends TextView {
private float length1;
private float textLength;
private float viewWidth;
private float step;
private float y;
private float length2;
public boolean isStarting;
private Paint paint;
private String text;
public MarqueeTextView(Context context) {
super(context);
}
public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void init(WindowManager windowManager) {
paint = getPaint();
Shader shader = new LinearGradient(0, 0, 800, 50, new int[] {
Color.GREEN, Color.argb(255, 237, 145, 33),
Color.argb(255, 255, 0, 255), Color.argb(255, 218, 112, 214),
Color.argb(255, 255, 99, 71), Color.argb(255, 124, 252, 0),
Color.RED }, null, TileMode.CLAMP);
paint.setShader(shader);
paint.setPathEffect(new CornerPathEffect(10));
text = getText().toString();
textLength = paint.measureText(text);
viewWidth = getWidth();
if (viewWidth == 0) {
if (windowManager != null) {
Display display = windowManager.getDefaultDisplay();
viewWidth = display.getWidth();
}
}
step = textLength;
length2 = viewWidth + textLength;
length1 = viewWidth + textLength * 2;
y = getTextSize() + getPaddingTop();
}
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.step = step;
ss.isStarting = isStarting;
return ss;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
step = ss.step;
isStarting = ss.isStarting;
}
public static class SavedState extends BaseSavedState {
public boolean isStarting = false;
public float step = 0.0f;
SavedState(Parcelable superState) {
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeBooleanArray(new boolean[] { isStarting });
out.writeFloat(step);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public SavedState[] newArray(int size) {
return new SavedState[size];
}
@Override
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
};
private SavedState(Parcel in) {
super(in);
boolean[] b = null;
in.readBooleanArray(b);
if (b != null && b.length > 0)
isStarting = b[0];
step = in.readFloat();
}
}
public void startScroll() {
isStarting = true;
invalidate();
}
public void stopScroll() {
isStarting = false;
invalidate();
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawText(text, length2 - step, y, paint);
if (!isStarting) {
return;
}
step += 5.0;
if (step > length1)
step = textLength;
invalidate();
}
}
在XML中的使用
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_marginTop="100dp"
android:layout_height="wrap_content"
android:text="世上只有一种英雄主义,就是在认清生活真相之后依然热爱生活"
android:singleLine="true"
android:textSize="20sp"
android:background="@android:color/white"
android:id="@+id/marquee_text"/>
在MainActivity中的使用
package com.example.test_marquee;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
private MarqueeTextView autoScrollTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
autoScrollTextView = (MarqueeTextView) findViewById(R.id.marquee_text);
autoScrollTextView.init(getWindowManager());
autoScrollTextView.startScroll();
}
}
如果需要更该跑马灯的中的文字只需要
autoScrollTextView.setText("");
autoScrollTextView.init(getWindowManager());
效果如下