日常搬砖,假装写一个横向的自动滚动的textview

搬砖过程中,猛然发现,这个效果图不是textview ,老板说他应该横向滚动,emmmm?
那么,我们来分析下需求:
这个自定义的textview 只占1行,可以循环滚动。文字只需要设置一次。当fragment 或者activity 被销毁的时候,线程也要销毁。
ok.由于canvas 中 获取到文本的宽度是不换行的。所以呢,我们开线程 修改x的位置就好了。

@Override
  protected void onDraw(Canvas canvas) {
      super.onDraw(canvas);
      height = getHeight();
      canvas.drawText(text,x,height/2+dp5,paint);
  }

额,感觉没有什么好说的。直接贴代码吧。

```

/**

  • 公告滚动控件
    */
    public class TipText extends View {
    String text="暂无数据";
    private Context context;
    private Paint paint;
    private int textWidth;
    private int textHeight;
    private int width;
    private int height;
    private int x=400;
    boolean opentrue=true;
    private int dp5;

    public void setText(String text) {
    this.text = text;
    textWidth = CanvasUtils.calcTextWidth(paint, text);
    textHeight = CanvasUtils.calcTextHeight(paint, text);
    new Thread(new Runnable() {
    @Override
    public void run() {
    while (opentrue){
    try {
    x=x-10;
    if (Math.abs(x)>=(textWidth+width/2)){
    x=400;
    }
    postInvalidate();
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }).start();
    }

    public TipText(Context context) {
    super(context);
    context = this.getContext();
    paint = new Paint();
    paint.setTextSize(Tools.dp2px(context,14));
    dp5 = Tools.dp2px(context, 5);
    paint.setColor(Color.parseColor("#ffffff"));

    }

    public TipText(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    context = this.getContext();
    paint = new Paint();
    paint.setTextSize(Tools.dp2px(context,14));
    paint.setColor(Color.parseColor("#ffffff"));
    dp5 = Tools.dp2px(context, 5);

    }

    public TipText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    context = this.getContext();
    paint = new Paint();
    paint.setTextSize(Tools.dp2px(context,14));
    paint.setColor(Color.parseColor("#ffffff"));
    dp5 = Tools.dp2px(context, 5);
    }
    @Override
    protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    height = getHeight();
    canvas.drawText(text,x,height/2+dp5,paint);
    }

    public void setOpentrue(boolean opentrue) {
    this.opentrue = opentrue;
    }
    }

上面用到的工具类:

/**
* 画布常用工具类
*/
public class CanvasUtils {
  private static Rect mCalcTextHeightRect = new Rect();
  /**
   * 通过画布预设获取当前文本的宽度
   * @param paint
   * @param demoText
   * @return
   */
  public static int calcTextWidth(Paint paint, String demoText) {
      return (int) paint.measureText(demoText);
  }

  /**
   * 通过 画布预设 获取当前文本的高度
   * @param paint
   * @param demoText
   * @return
   */
  public static int calcTextHeight(Paint paint, String demoText) {

      Rect r = mCalcTextHeightRect;
      r.set(0,0,0,0);
      paint.getTextBounds(demoText, 0, demoText.length(), r);
      return r.height();
  }

}

tools.dp2x();就是字面意思,将dp 值转为2x的 px 值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,950评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,466评论 2 59
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,705评论 0 17
  • 5,6岁的时候觉得22岁是一个能持家的年纪,这一点,父亲做到了; 7,8岁时我常跟爷爷说“有啥吃啥...
    鎏金雕石阅读 1,846评论 0 1
  • ——至高三那年可爱的火烧云同桌 记得那年上高中,寝室熄灯后,大家开始进行了脑洞大开的寝室卧谈会,大家从赛歌喉开始,...
    芥末味水晶阅读 3,244评论 0 0