5

現在、複数の Clickable オブジェクトが設定された SpannableString オブジェクトがあります。したがって、1 つの文字列には多くの Clickable オブジェクトがあり、ユーザーがクリックした単語/セクションに応じて、アプリは続行し、そのクリック イベントの処理を行います。先日、私は Stackoverflow で SpannableString の単語の一部にある青い下線を取り除くことについて質問しましたが、答えは ClickableSpan クラスをサブクラス化し、updateDrawState メソッドをオーバーライドし、underlineText を false に設定することでした。

私の問題: SpannableString で Clickable オブジェクトの周りに境界線を配置することは可能ですか? したがって、基本的に各クリック可能なオブジェクト/文字列には独自の境界線が必要です。

updateDrawState メソッドが役立つかもしれないと思ったのですが、そうではありませんでした。これを達成する方法を知っている人はいますか?

ありがとう。

4

1 に答える 1

5

ReplacementSpan輪郭を描いたスパンを作るために伸ばしました。残念ながら、それらをラップすることはできませんが、アウトラインをいくつかの単語に適用するだけであれば、うまくいくはずです. setSpan(ClickableSpanWithoutUnderline...)これをクリック可能にするには、これを設定する前に言及したサブクラスを使用するだけです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_replacement_span);

    final Context context = this;
    final TextView tv = (TextView) findViewById(R.id.tv);


    Spannable span = Spannable.Factory.getInstance().newSpannable("Some string");
    span.setSpan(new BorderedSpan(context), 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    tv.setText(span, TextView.BufferType.SPANNABLE);
}


public static class BorderedSpan extends ReplacementSpan {
    final Paint mPaintBorder, mPaintBackground;
    int mWidth;
    Resources r;
    int mTextColor;

    public BorderedSpan(Context context) {
        mPaintBorder = new Paint();
        mPaintBorder.setStyle(Paint.Style.STROKE);
        mPaintBorder.setAntiAlias(true);

        mPaintBackground = new Paint();
        mPaintBackground.setStyle(Paint.Style.FILL);
        mPaintBackground.setAntiAlias(true);

        r = context.getResources();

        mPaintBorder.setColor(Color.RED);
        mPaintBackground.setColor(Color.GREEN);
        mTextColor = Color.BLACK;
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        //return text with relative to the Paint
        mWidth = (int) paint.measureText(text, start, end);
        return mWidth;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        canvas.drawRect(x, top, x + mWidth, bottom, mPaintBackground);
        canvas.drawRect(x, top, x + mWidth, bottom, mPaintBorder);
        paint.setColor(mTextColor); //use the default text paint to preserve font size/style
        canvas.drawText(text, start, end, x, y, paint);
    }
}
于 2015-03-31T16:24:38.237 に答える