有关自定义TextView和EditText的学习

自定义EditText实现文字加下划线:

在这里插入图片描述
坑:
      第一次做的思路:重写onDraw方法,然后通过 getLineCount()获取行数,然后通过getLineHeight()获取每行的高度在通过
canvas.drawLine(0, lineHeight , getWidth(), lineHeight,paint);不断添加进去。
做出的效果:
在这里插入图片描述
getLineHeigh获取的高度都是定值,但是文字显示高度会有细微的不同。
为了解决这个问题谷歌提供了getLineBounds方法来获取指定行数的高度。
代码:

public class MyEdittext extends EditText {
    private Rect mRect;
    private Paint mPaint;

    private final int padding =20;

    private int lineHeight;
    private int viewHeight, viewWidth;

    public MyEdittext(Context context) {
        this(context, null);
    }

    public MyEdittext(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.editTextStyle);
    }


    public MyEdittext(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        mRect = new Rect();
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.BLACK);
        mPaint.setAntiAlias(true);

        setFocusable(true);
        setFocusableInTouchMode(true);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        int count = getLineCount();//获取行数
        Rect r = mRect;
        Paint paint = mPaint;
      
        int lineHeight = 0;
        int i = 0;
        while (i < count) {
            lineHeight = getLineBounds(i, r);
            canvas.drawLine(r.left, lineHeight + padding, r.right, lineHeight + padding,
                    paint);
            i++;
        }
        super.onDraw(canvas);
    }

}

效果:在这里插入图片描述

自定义跑马灯TextView

思路:
通过 canvas.drawText();不断重复绘制
代码:

public class AutoScrollTextView extends TextView {
    public AutoScrollTextView(Context context) {
        super(context);
    }

    public AutoScrollTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AutoScrollTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    public final static String TAG = AutoScrollTextView.class.getSimpleName();

    private float textLength = 0f;//文本长度
    private float viewWidth = 0f;
    private float step = 0f;//文字的横坐标
    private float y = 0f;//文字的纵坐标
    private float temp_view_plus_text_length = 0.0f;//用于计算的临时变量
    public boolean isStarting = true;//是否开始滚动
    private Paint paint = null;//绘图样式
    private float speed = 0.8f;
    private int textColor=0xFF000000;
    private boolean isMeasure = false;

    public int getTextColor() {
        return textColor;
    }

    public void setTextColor(int color) {
        this.textColor = color;
    }

    public float getSpeed() {
        return speed;
    }

    public void setSpeed(float speed) {
        this.speed = speed;
    }


    public void measureText() {
        paint = getPaint();
        if(paint!=null){

            paint.setColor(textColor);

            textLength = paint.measureText(getText().toString());
        }
        viewWidth = getWidth();
        step = textLength;
        temp_view_plus_text_length = viewWidth + textLength;
        y = getTextSize()+getPaddingTop();
    }

    public void startScroll(float speed) {
        isStarting = true;
        this.speed = speed;
        invalidate();
    }


    public void stopScroll() {
        isStarting = false;
        invalidate();
    }


    @Override
    public void onDraw(Canvas canvas) {
        if(getText() == null)
            return;
        if(isStarting){

            if (!isMeasure) {// 文字宽度只需获取一次
                isMeasure = true;
                measureText();
            }
//水平方向由右向左
            CharSequence text = getText().toString();
            if (text != null&& !TextUtils.isEmpty(text)) {
                canvas.drawText(text,0,text.length(),temp_view_plus_text_length - step, y, paint);
            }
            if (!isStarting) {
                return;
            }
            
            step += speed;
            if (step > temp_view_plus_text_length +viewWidth)
                step = textLength;
            invalidate();
        }else{
            super.onDraw(canvas);
        }

    }
  


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值