web-dev-qa-db-ja.com

テキストの色とは異なる色でTextViewのテキストに下線を引く方法は?

テキストビューでテキストに下線を引く方法を知っています。しかし、いくつかの異なる色でテキストに下線を引くにはどうすればよいですか?下線は次のようにして行うことができます:

TextView t = (TextView) findViewById(R.id.textview);
t.setPaintFlags(t.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
t.setText("Underline Text");

テキストの色が黒で、同じ色に青の下線を引きたいとしましょう。前もって感謝します。

16
Vipul J

私は同じ問題を抱えており、EditTextでこれを行うための他の投稿を読んでいるときに Layout クラスに遭遇しました。キャンバスで下線を手動で描くことで、これを実現するために必要なすべてを提供します。

最初に、XMLレイアウトファイルで簡単にカスタマイズできるようにカスタム属性を定義しました

<declare-styleable name="UnderlinedTextView" >
    <attr name="underlineWidth" format="dimension" />
    <attr name="underlineColor" format="color" />
</declare-styleable>

そしてカスタムTextViewクラス

public class UnderlinedTextView extends AppCompatTextView {

    private Rect mRect;
    private Paint mPaint;
    private float mStrokeWidth;

    public UnderlinedTextView(Context context) {
        this(context, null, 0);
    }

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

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

    private void init(Context context, AttributeSet attributeSet, int defStyle) {

        float density = context.getResources().getDisplayMetrics().density;

        TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.UnderlinedTextView, defStyle, 0);
        int underlineColor = typedArray.getColor(R.styleable.UnderlinedTextView_underlineColor, 0xFFFF0000);
        mStrokeWidth = typedArray.getDimension(R.styleable.UnderlinedTextView_underlineWidth, density * 2);
        typedArray.recycle();

        mRect = new Rect();
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(underlineColor);
        mPaint.setStrokeWidth(mStrokeWidth);
    }

    public int getUnderLineColor() {
        return mPaint.getColor();
    }

    public void setUnderLineColor(int mColor) {
        mPaint.setColor(mColor);
        invalidate();
    }

    public float getUnderlineWidth() {
        return mStrokeWidth;
    }

    public void setUnderlineWidth(float mStrokeWidth) {
        this.mStrokeWidth = mStrokeWidth;
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {

        int count = getLineCount();

        final Layout layout = getLayout();
        float x_start, x_stop, x_diff;
        int firstCharInLine, lastCharInLine;

        for (int i = 0; i < count; i++) {
            int baseline = getLineBounds(i, mRect);
            firstCharInLine = layout.getLineStart(i);
            lastCharInLine = layout.getLineEnd(i);

            x_start = layout.getPrimaryHorizontal(firstCharInLine);
            x_diff = layout.getPrimaryHorizontal(firstCharInLine + 1) - x_start;
            x_stop = layout.getPrimaryHorizontal(lastCharInLine - 1) + x_diff;

            canvas.drawLine(x_start, baseline + mStrokeWidth, x_stop, baseline + mStrokeWidth, mPaint);
        }

        super.onDraw(canvas);
    }
}

使い方は簡単です

<some.package.UnderlinedTextView
    Android:id="@+id/tvTest"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_marginBottom="10dp"
    Android:layout_marginLeft="20dp"
    Android:layout_marginRight="20dp"
    Android:gravity="center"
    Android:text="This is a demo text"
    Android:textSize="16sp"
    app:underlineColor="#ffc112ef"
    app:underlineWidth="3dp"/>

最終結果

  • マルチライン

    enter image description here
  • 単線

    enter image description here
17
Bojan Kseneman

以下のように試すことができます:

  String styledText = "<u><font color='red'>Underline Text</font></u>.";
  textView.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE);
4
GrIsHu

あなたがXMLのファンなら。私の解決策を見てください:

セレクターselector_edittext_white.xmlをドローアブルフォルダーに作成します

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item Android:bottom="-15dp">
    <rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:fromDegrees="0"
        Android:pivotX="0.5"
        Android:pivotY="0.5"
        Android:toDegrees="0">
        <shape Android:shape="line">
            <stroke
                Android:width="0.5dp"
                Android:color="@Android:color/white" />
        </shape>
    </rotate>
  </item>
</layer-list>

次に、EditTextを設定します

Android:background="@drawable/selector_edittext_white"

上記の設定では、下線の色はwhiteであり、上記のAndroid:bottomを変更することで移動できます "-15dp"。消えてしまった場合は、このようにEditTextの下マージンを設定してみてください

Android:layout_marginBottom="5dp"
3
windyzboy
imee.setText(Html.fromHtml("<font color=#9e4c4e>  <u>" + ime + "</u>  </font>"));
avtorr.setText(Html.fromHtml("<font color=#90494f>  <u>" + avtorr + "</u>  </font>"));

最善の解決策は、HTMLを使用することです。

0
N Kostic