簡體   English   中英

帶有筆觸的寬度和高度自定義Textview不起作用

[英]Width and Height Custom Textview with stroke not work

我有一個自定義TextView來設置描邊線,並且此TextView的根布局是帶有wrap_content的RelativeLayout,但是當我更改描邊大小時,布局中的寬度和高度不能隨描邊的TextView大小進行調整,而描邊隨布局而被截斷。 這是我的自定義TextView:

    import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;

public class TextViewCustom extends TextView {

    private static final int DEFAULT_OUTLINE_COLOR = Color.parseColor("#00FFFFFF");
    private static final int DEFAULT_OUTLINE_SIZE = 0;
    private static final boolean DEFAULT_OUTLINE_STATE = true;

    private int outlineColor;
    private int outlineSize;
    private boolean outlineState;

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

    public TextViewCustom(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TextViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        outlineColor = DEFAULT_OUTLINE_COLOR;
        outlineSize = DEFAULT_OUTLINE_SIZE;
        outlineState = DEFAULT_OUTLINE_STATE;
    }

    public int getOutlineColor() {
        return outlineColor;
    }

    public void setOutlineColor(int outlineColor) {
        this.outlineColor = outlineColor;
        invalidate();
    }

    public int getOutlineSize() {
        return outlineSize;
    }

    public void setOutlineSize(int outlineSize) {
        this.outlineSize = outlineSize;
        invalidate();
    }

    public boolean getOutlineState() {
        return outlineState;
    }

    public void setOutlineState(boolean state) {
        outlineState = state;
        invalidate();
    }

    @Override
    public void draw(Canvas canvas) {
        if (outlineState) {
            getPaint().setColor(outlineColor);
            getPaint().setStyle(Paint.Style.STROKE);
            getPaint().setStrokeWidth(outlineSize);

            canvas.save();
            canvas.translate(getCompoundPaddingLeft() + outlineSize, getCompoundPaddingTop());

            getLayout().draw(canvas);
            canvas.restore();
        }

        getPaint().setColor(getCurrentTextColor());
        getPaint().setStyle(Paint.Style.FILL);
        canvas.save();
        canvas.translate(outlineSize, 0);

        super.draw(canvas);
        canvas.restore();
    }

    @Override
    public boolean onSetAlpha(int alpha) {
        setTextColor(getTextColors().withAlpha(alpha));
        setHintTextColor(getHintTextColors().withAlpha(alpha));
        setLinkTextColor(getLinkTextColors().withAlpha(alpha));
        getBackground().setAlpha(alpha);
        return true;
    }
}

重寫onDraw()方法不是用筆觸制作TextView的好方法。 而不是您應該使用xml並將其設置為TextView的背景。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <stroke
      android:width="1dp"
      android:color="your stoke color" />
   <solid android:color="your background color" />
</shape>

並在布局中

<TextView ... android:background="@drawable/your xml file" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM