2013-09-27 60 views
9

我知道如何在textview中加下劃線。但是如何用不同顏色的文字加下劃線? 下劃線是可以做到的:如何在TextView中使用與文本不同的顏色來強調文本?

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

讓說我的文字顏色是黑色的,我想強調與藍色一樣,該怎麼辦呢? 在此先感謝。

+0

恐怕你需要兩個textviews爲! – dd619

+0

您可以像這樣使用 Email.setText(「W:」+「」+ Email1 +「」)); 使用顏色代碼你想要什麼。 – khubaib

回答

0
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。

+0

** Color.RED **用於選擇油漆的顏色。 –

+0

這不行! –

+0

查看我的更新回答 –

3

可以如下嘗試:

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

這也會改變文字的顏色,我只想設置下劃線的顏色。謝謝 –

+0

檢查出可能幫助你的帖子。 http://stackoverflow.com/questions/13238298/android-change-underline-color-from-an-edittext-dynamically – GrIsHu

2

如果你是一個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" 

在設置上面,下劃線的顏色是白色,你可以通過改變android:bottom來移動它,上面是「-15dp」。在情況下,它消失了,嘗試設置您的EditText下邊距這樣

android:layout_marginBottom="5dp" 
8

我有同樣的問題,並閱讀一些其他職位上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
+0

我該如何強調只有特定的文本與此自定義視圖,沒有spannable和其他.... – TheGreat004

2

我不能添加評論還沒有,所以我張貼作爲一個答案,而不是。

我只想說博揚Kseneman的回答(https://stackoverflow.com/a/30717100/2771087)是太棒了。不過,我想糾正一個問題。

而不是找到一行中最後一個字符的結束位置,它抓住第二個最後一個字符的結尾,然後添加行中第一個字符的寬度。這兩條線的位置:

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

取而代之,getSecondaryHorizo​​ntal()可用於抓住的字符的相對側,如在:

x_stop = layout.getSecondaryHorizontal(lastCharInLine); 

然而,這也將強調的空間在多行文本區域的每行結尾。因此,要解決這個問題,請使用如下代碼計算x_stop之前跳過它:

while (lastCharInLine != firstCharInLine && 
     Character.isWhitespace(getText().charAt(lastCharInLine - 1))) { 
    lastCharInLine--; 
} 
0

另一種解決方案,不延長TextView的這段時間(基於我寫了很久以前的一個問題,here):

有被拉伸,以顯示爲下劃線,並有文字本身跨度:

text_underline.xml

<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="line"> 
    <padding android:bottom="10dp"/> 
    <stroke 
     android:width="1dp" 
     android:color="#3792e5"/> 
</shape> 

DrawableSpan.kt

class DrawableSpan(private val drawable: Drawable) : ReplacementSpan() { 
    private val padding: Rect = Rect() 

    init { 
     drawable.getPadding(padding) 
    } 

    override fun draw(canvas: Canvas, text: CharSequence, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) { 
     val rect = RectF(x, top.toFloat(), x + measureText(paint, text, start, end), bottom.toFloat()) 
     drawable.setBounds(rect.left.toInt() - padding.left, rect.top.toInt() - padding.top, rect.right.toInt() + padding.right, rect.bottom.toInt() + padding.bottom) 
     canvas.drawText(text, start, end, x, y.toFloat(), paint) 
     drawable.draw(canvas) 
    } 

    override fun getSize(paint: Paint, text: CharSequence, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int = Math.round(paint.measureText(text, start, end)) 

    private fun measureText(paint: Paint, text: CharSequence, start: Int, end: Int): Float = paint.measureText(text, start, end) 

} 

用法:

val text = getString(R.string.large_text) 
    val spannable = SpannableString(text) 
    spannable.setSpan(DrawableSpan(resources.getDrawable(R.drawable.text_underline)), 0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) 
    textView.setText(spannable, TextView.BufferType.SPANNABLE) 

而結果:

enter image description here

相關問題