Android自绘跑马灯控件,你会了吗?

时间:2022-04-26
本文章向大家介绍Android自绘跑马灯控件,你会了吗?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Android上实现一个简单的跑马灯控件,通过点击start or stop

<font size="3">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 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, 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();
  }
  }</font>