【问题标题】:How to show a text in 2 colors in android?如何在android中以2种颜色显示文本?
【发布时间】:2017-04-17 01:24:16
【问题描述】:

我有一个与它重叠的其他视图的文本(在RelativeLayout 中)。我想要不同颜色的重叠视图内的文本部分和不同颜色视图之外的文本部分。请查看相同的示例图片。

我尝试使用TextView 来重叠视图并设置其textColor 属性,但这不起作用。任何帮助将不胜感激。

编辑:如图所示,我希望“a”的某些部分具有不同的颜色,而椭圆形内的其余部分具有不同的颜色。

编辑:考虑以下示例代码,它说明了我的目的。这里字母“m”在另一部分(红色部分)中有一部分。目前所有文本都是白色的。我需要的是边界之后的部分(从红色视图开始的位置)所有文本都为黑色。屏幕截图也附在下面。希望现在我清楚了。

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:background="#0000ff">

            <View
                android:layout_width="257dp"
                android:layout_height="match_parent"
                android:background="#ff0000"
                android:layout_alignParentRight="true"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="Hi I am some text"
                android:textColor="#ffffff"/>

        </RelativeLayout>

【问题讨论】:

  • 发布您的代码。

标签: android layout textview


【解决方案1】:

我想出了一个方法来实现这一点。虽然我找不到在 TextView 中以两种颜色显示文本的方法。但是如果我们创建一个自定义视图类并在画布上绘制形状和文本并使用颜色混合 (PorterDuffXferMode),则可能会产生类似的效果。

这是我使用的自定义视图的 onDraw 方法的示例代码:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int color1 = Color.rgb(137, 195, 246);  // outside background's color
    int color2 = Color.rgb(246, 187, 137);  // inside background's color
    int color3 = Color.WHITE;   // outside text's color
    int color4 = Color.BLACK;   // inside text's color

    canvas.drawColor(color1);   // fill outside background

    // make inside oval shape and fill it
    Paint paint = new Paint();
    paint.setColor(color2);
    canvas.drawArc(getWidth()*0.36f, 20, getWidth()*3/4, getHeight()-20, 0, 360, false, paint);

    /* create a bitnmap for a new canvas */
    Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), ARGB_8888);
    Canvas bitmapCanvas = new Canvas(bitmap);   // new canvas

    /* draw text on bitmapCanvas */
    paint.setColor(color3);
    paint.setTextSize(80);
    bitmapCanvas.drawText("Hi I am some text", 50, 140, paint);

    /* use "source in" PorterDuff mode and draw inside oval on bitmapCanvas
    *  using color4 so that only the text inside oval will remain in color4 and
    *  rest will be transparent*/
    Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
    paint.setXfermode(xfermode);
    paint.setColor(color4);
    bitmapCanvas.drawArc(getWidth()*0.36f, 20, getWidth()*3/4, getHeight()-20, 0, 360, false, paint);

    /* draw this bitmap to original canvas */
    paint.setXfermode(null);
    canvas.drawBitmap(bitmap,0,0,paint);
}

视图看起来像这样:

【讨论】:

    【解决方案2】:

    只需像这样在 string.xml 中添加你的句子:

    <resources>
      <string name="some_text"><font fgcolor="#FFFFFF">Hi i am</font><font fgcolor="#ffff0000">some red text</font></string> 
    </resources>
    

    你可以这样设置:

    String styledText = getResources().getString(R.string.some_text);
    sometext.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE);
    

    【讨论】:

    • 我已经更新了这个问题。我需要的是椭圆外的部分是不同的颜色,椭圆内的部分是不同的颜色。
    • 新答案似乎没有做任何事情。它只是显示纯文本。我认为新的 android 版本存在一些问题-as shown here 但我的问题是你没有做任何特定的设置,例如字母“a”的某些部分在椭圆形内部,而某些部分在外部。我希望这两个部分具有不同的颜色。我不清楚如何实现这一目标。希望我很清楚。
    • 只需制作一个该颜色的PNG文件并将其设置为线性布局背景。并在该布局下设置文本视图。
    • 你能再解释一下吗?
    【解决方案3】:

    尝试创建 Spannable 并将 Spannable 设置为您的文本视图,尝试这样

     TextView textview = (TextView)findViewById(R.id.textview);
    
        Spannable colorSpan = new SpannableString("HI I am some text");        
    
        colorSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        textview.setText(colorSpan);
    

    【讨论】:

    • 我已经更新了这个问题。我需要椭圆内的字母“a”部分具有不同的颜色。
    猜你喜欢
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2019-11-25
    • 2014-12-03
    • 2011-02-13
    相关资源
    最近更新 更多