使用Spannable的单词不正确

时间:2014-06-07 18:32:16

标签: android spannable

我想有一个自定义的Spannable,如下图:

enter image description here

我想在不正确的单词下创建Zigzag行。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

你最肯定想要检查一下这个我一起入侵的实现。但仍然。希望它仍然能够为正确实现这样的功能提供一些基础。

实际的span类,令人惊讶的是,它不会取代任何东西。只希望能够在两行代码中绘制原始跨度文本。另外还画了“下划线”。

private class ErrorSpan extends ReplacementSpan {

    private Paint errorPaint;

    public ErrorSpan() {
        errorPaint = new Paint();
        errorPaint.setColor(Color.RED);
    }

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

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end,
            float x, int top, int y, int bottom, Paint paint) {
        // Render the red zigzag lines below text
        float width = paint.measureText(text, start, end);
        canvas.save();
        canvas.clipRect(x, bottom - 5, x + width, bottom);
        for (float lineX = x; lineX < x + width; lineX += 10) {
            canvas.drawLine(lineX, bottom - 5, lineX + 5, bottom, errorPaint);
            canvas.drawLine(lineX + 5, bottom, lineX + 10, bottom - 5, errorPaint);
        }
        canvas.restore();
        // Render the span text as-is
        canvas.drawText(text, start, end, x, y, paint);
    }    
};

请原谅我在画线循环中使用幻数(这很可能也会更有效) - 但希望它能够为最终创建生产质量的实施提供足够的基础。

使用方法可能就在附近:

TextView tv = (TextView)findViewById(R.id.textview);
Spannable spannable = Spannable.Factory.getInstance()
                         .newSpannable("testtest\ntesttest");
spannable.setSpan(new ErrorSpan(), 4, 8, 0);
spannable.setSpan(new ErrorSpan(), 9, 13, 0);
tv.setText(spannable);