【问题标题】:Width and Height Custom Textview with stroke not work带有笔划的宽度和高度自定义Textview不起作用
【发布时间】:2023-03-07 18:36:01
【问题描述】:

我有一个自定义的 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;
    }
}

【问题讨论】:

    标签: java android android-layout android-custom-view


    【解决方案1】:

    重写 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" />
    

    【讨论】:

    • 我想以编程方式和动态设置笔画..所以如果我使用 xml 设置不是解决方案..
    • @NafianWildana 您可以通过代码创建形状并将其设置为文本视图的背景。覆盖onDraw会导致一些我们无法处理的问题。
    • 你能给我举个例子,用java代码来动态改变笔画宽度吗?因为我在自定义 textview 类的 setOutlineSize() 方法中设置了笔画大小的值。
    • 你可以看看这个已回答的问题create-a-shape-dynamically
    • 这只是将笔划设置为 textview 区域,结果在 textview 之外的框中给我笔划,而不是文本中的笔划,我想在文本区域设置笔划...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2013-10-26
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多