2015-04-04 67 views
3

我正在尝试创建一个跨度来给文本一个四舍五入的背景。但是,draw方法永远不会被调用。自定义文本跨度不能正常工作

这是代码:

public class RoundedBackgroundSpan extends ReplacementSpan { 

    @Override 
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) 
    { 
     RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), bottom); 
     paint.setColor(Color.BLUE); 
     canvas.drawRoundRect(rect, 100f, 30f, paint); 
     paint.setColor(Color.WHITE); 
     canvas.drawText(text, start, end, x, y, paint); 
    } 

    @Override 
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) 
    { 
     return Math.round(measureText(paint, text, start, end)); 
    } 

    private float measureText(Paint paint, CharSequence text, int start, int end) 
    { 
     return paint.measureText(text, start, end); 
    } 
} 

这就是我如何设置它:

Spannable spannable = new SpannableString(introText.getText()); 
spannable.setSpan(new RoundedBackgroundSpan(), 0, textView.getText().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
textView.setText(spannable); 

我没有,为什么这不工作的头绪。

+0

http://stackoverflow.com/questions/20069537/replacementspans-draw-method-isnt-called可能会给你一些线索。我还没有使用'ReplacementSpan'的自定义子类。 – CommonsWare 2015-04-04 15:21:01

+0

答案建议将第二个参数添加到setText,以便它变成textView.setText(spanned,TextView.BufferType.SPANNABLE);但对于我来说这还没有工作。 getSize方法被调用,虽然 – 2015-04-04 15:33:57

+0

我发现一个黑客,使它的工作,看到我的答案在这里:http://stackoverflow.com/a/32170735/258848 – dimsuz 2015-08-23 19:39:19

回答

0

像下面

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#FFFFFF" /> 
    <stroke android:width="1dp" android:color="#000000" /> 
    <padding android:left="1dp" android:top="1dp" android:right="1dp" 
     android:bottom="1dp" /> 
    <corners 
     android:bottomRightRadius="15dp" 
     android:bottomLeftRadius="15dp" 
     android:topLeftRadius="15dp" 
     android:topRightRadius="15dp"/> 
</shape> 

在XML文件中创建shapes.xml,采用Android:背景= “@绘制/形状” 的文本。

+0

但是,这不会工作,如果我只想添加圆角背景到子字符串,而不是整个字符串。 – 2017-06-02 02:11:29