美文网首页
日常搬砖,假装写一个横向的自动滚动的textview

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

作者: luoye呀 | 来源:发表于2018-12-04 15:19 被阅读0次

    搬砖过程中,猛然发现,这个效果图不是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 值。

    相关文章

      网友评论

          本文标题:日常搬砖,假装写一个横向的自动滚动的textview

          本文链接:https://www.haomeiwen.com/subject/khomcqtx.html