前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android自绘跑马灯控件,你会了吗?

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

作者头像
非著名程序员
发布2018-02-01 15:25:41
9300
发布2018-02-01 15:25:41
举报
文章被收录于专栏:非著名程序员非著名程序员

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

代码语言:js
复制
<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>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非著名程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档