如何在TextView中使用与文本不同的颜色来强调文本?

我知道如何在textview中加下划线。 但是如何用不同的颜色来突出文字? 下划线可以通过以下方式完成:

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

假设我的textcolor是黑色的,我想用蓝色来强调它,怎么做呢? 提前致谢。

Related of "如何在TextView中使用与文本不同的颜色来强调文本?"

我遇到了同样的问题,在EditText上阅读其他一些文章时,偶然发现了Layout类。 它提供了一切你需要通过手工绘制与canvas下划线来做到这一点。

首先,我定义了自定义属性,以便在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"/> 

最后结果

  • 多线

    在这里输入图像说明

  • 单线

    在这里输入图像说明

你可以尝试如下:

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

如果你是一个XML的粉丝。 看看我的解决scheme:

在drawable文件夹中创build一个selectselector_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" 

在上面的设置中,下划线的颜色是白色的 ,您可以通过更改android:bottom移动它android:bottom上方是“-15dp”。 如果它消失,尝试设置您的EditText底部边距像这样

 android:layout_marginBottom="5dp" 

我目前还无法添加评论,因此我将其发布为答案。

我只想说Bojan Kseneman的回答( https://stackoverflow.com/a/30717100/2771087 )太棒了。 不过,我想纠正一个问题。

不是在一行中find最后一个字符的结束位置,而是抓取第二个最后一个字符的结尾,然后在行中加上第一个字符的宽度。 这两行在这里:

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

取而代之,可以使用getSecondaryHorizo​​ntal()来获取angular色的另一面,如下所示:

 x_stop = layout.getSecondaryHorizontal(lastCharInLine); 

但是,这也将突出显示多行文本区域每行结尾处的空间。 所以要解决这个问题,请使用下面的代码在计算x_stop之前跳过它:

 while (lastCharInLine != firstCharInLine && Character.isWhitespace(getText().charAt(lastCharInLine - 1))) { lastCharInLine--; } 
  Paint p = new Paint(); p.setColor(Color.RED); TextView t = (TextView) findViewById(R.id.textview); t.setPaintFlags(p.getColor()); t.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG); t.setText("Underline Text"); 

做一个新的油漆颜色。 并将该画图分配给textview。