Android上实现一个简单的跑马灯控件,通过点击start or stop
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Paint;
- import android.os.Parcel;
- import android.os.Parcelable;
- import android.util.AttributeSet;
- import android.view.Display;
- import android.view.View;
- import android.view.WindowManager;
- import android.view.View.OnClickListener;
- import android.widget.TextView;
-
-
- public class MarqueeView extends TextView implements OnClickListener {
-
public final static String TAG = MarqueeView.class.getSimpleName();
-
private float textLength = 0f; // 文本长度
-
private float viewWidth = 0f; //控件显示文字区域宽度
-
private float step = 0f; // 文字的横坐标
-
private float y = 0f; // 文字的纵坐标
-
public boolean isStarting = true;// 是否开始滚动
-
private Paint paint = null;// 绘图样式
-
private String text = "";// 文本内容
-
-
public MarqueeView(Context context) {
-
super(context);
-
initView();
-
}
-
-
public MarqueeView(Context context, AttributeSet attrs) {
-
super(context, attrs);
-
initView();
-
}
-
-
public MarqueeView(Context context, AttributeSet attrs, int defStyle) {
-
super(context, attrs, defStyle);
-
initView();
-
}
-
-
-
private void initView() {
-
setOnClickListener(this);
-
}
-
-
-
public void init(WindowManager windowManager) {
-
paint = getPaint();
-
text = getText().toString();
-
textLength = paint.measureText(text);
-
viewWidth = getWidth();
-
if (viewWidth == 0) {
-
if (windowManager != null) {
-
Display display = windowManager.getDefaultDisplay();
-
viewWidth = display.getWidth();
-
}
-
}
-
step = 0;
-
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);
-
}
-
-
public void writeToParcel(Parcel out, int flags) {
-
super.writeToParcel(out, flags);
-
out.writeBooleanArray(new boolean[] { isStarting });
-
out.writeFloat(step);
-
}
-
-
public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
-
-
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, step, y, paint);
-
if (!isStarting) {
-
return;
-
}
-
step -= 0.8;
-
if (step <= -textLength)
-
step = viewWidth;
-
invalidate();
-
}
-
-
@Override
-
public void onClick(View v) {
-
if (isStarting)
-
stopScroll();
-
else
-
startScroll();
-
}
- }