android中span,Android中的ReplacementSpan替代方案

我有一个应用程序,可以分页大文本,并为每个单词或句子设置多个跨度.我正在使用ReplacementSpan为每个单词绘制背景.我不能使用BackgroundSpan,因为它太简单了,不能让我控制画布.由于ReplacementSpan扩展了MetricAffectingSpan,它影响了文本的布局,完全打破了我的分页.我正在使用StaticLayout来计算每个页面的文本,而StaticLayout不允许跨越,因此它可以计算跨越大小影响的先验.

ReplacementSpan有替代品吗?如何在不影响文本大小和布局的情况下绘制我想要的背景?

这是我的replacementspan的代码:

public class BackgroundColorWithoutLineHeightSpan extends ReplacementSpan {

private static final float DP_ACTIVE = ViewsUtils.dpToPx(4);

private static final int DP_OUTSIDE_PADDING = (int) ViewsUtils.dpToPx(6);

private static final float DP_PHRASE = ViewsUtils.dpToPx(4);

private static final float DP_ROUNDED = ViewsUtils.dpToPx(3);

private final int mColor;

private final int mTextHeight;

private int mBorderColor;

private boolean mIsSelected;

private boolean mIsPhrase;

public BackgroundColorWithoutLineHeightSpan(int color,int textHeight,boolean isPhrase) {

mColor = color;

mTextHeight = textHeight;

mIsPhrase = isPhrase;

}

public BackgroundColorWithoutLineHeightSpan(int color,boolean isSelected,int borderColor,boolean isPhrase) {

mColor = color;

mTextHeight = textHeight;

mIsSelected = isSelected;

mBorderColor = borderColor;

mIsPhrase = isPhrase;

}

@Override

public int getSize(@NonNull Paint paint,CharSequence text,int start,int end,Paint.FontMetricsInt fm) {

return Math.round(measureText(paint,text,start,end));

}

@Override

public void draw(@NonNull Canvas canvas,float x,int top,int y,int bottom,Paint paint) {

canvas.save();

Rect newRect = canvas.getClipBounds();

newRect.inset(-DP_OUTSIDE_PADDING,-DP_OUTSIDE_PADDING);

canvas.clipRect(newRect,Region.Op.REPLACE);

float measuredText = measureText(paint,end);

int paintColor = paint.getColor();

if (!mIsSelected) {

RectF rect;

rect = new RectF(x,top,x + measuredText,top + mTextHeight);

paint.setStrokeWidth(0.0f);

paint.setColor(mColor);

paint.setStyle(Paint.Style.FILL);

canvas.drawRoundRect(rect,DP_ROUNDED,paint);

} else {

RectF rect;

if (mIsPhrase) {

rect = new RectF(x - DP_PHRASE,top - DP_PHRASE,x + measuredText + DP_PHRASE,top + mTextHeight + DP_PHRASE);

} else {

rect = new RectF(x - DP_ACTIVE,top - DP_ACTIVE,x + measuredText + DP_ACTIVE,top + mTextHeight + DP_ACTIVE);

}

paint.setStrokeWidth(0.0f);

paint.setColor(mColor);

paint.setStyle(Paint.Style.FILL);

canvas.drawRoundRect(rect,paint);

RectF border;

if (mIsPhrase) {

border = new RectF(x - DP_PHRASE,top + mTextHeight + DP_PHRASE);

} else {

border = new RectF(x - DP_ACTIVE,top + mTextHeight + DP_ACTIVE);

}

paint.setColor(mBorderColor);

paint.setStrokeWidth(4.0f);

paint.setStyle(Paint.Style.STROKE);

canvas.drawRoundRect(border,paint);

}

paint.setStyle(Paint.Style.FILL);

paint.setColor(paintColor);

canvas.drawText(text,end,x,y,paint);

canvas.restore();

}

private float measureText(Paint paint,int end) {

return paint.measureText(text,end);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在SpannableStringBuilder对齐位图,可以使用Imagespan和LeadingMarginSpan组合来实现。具体的步骤如下: 1. 创建一个Bitmap对象,用于表示要插入的位图。 2. 创建一个ImageSpan对象,并将Bitmap对象作为其参数,设置ImageSpan的对齐方式。 3. 创建一个LeadingMarginSpan对象,并将其与ImageSpan对象一起添加到SpannableStringBuilder。 4. 在SpannableStringBuilder插入文本,并将ImageSpan和LeadingMarginSpan应用于文本。 示例代码如下: ```java Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); // 创建位图 ImageSpan imageSpan = new ImageSpan(this, bitmap, ImageSpan.ALIGN_BASELINE); // 创建ImageSpan对象 LeadingMarginSpan marginSpan = new LeadingMarginSpan.Standard(bitmap.getWidth()); // 创建LeadingMarginSpan对象 SpannableStringBuilder builder = new SpannableStringBuilder("插入位图"); // 创建SpannableStringBuilder对象 builder.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 将ImageSpan应用于文本 builder.setSpan(marginSpan, 0, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 将LeadingMarginSpan应用于文本 TextView textView = findViewById(R.id.text_view); textView.setText(builder); // 将SpannableStringBuilder显示在TextView ``` 在上面的示例代码,我们首先创建了一个位图对象,然后创建一个ImageSpan对象,并将位图对象作为其参数。我们将ImageSpan的对齐方式设置为ALIGN_BASELINE,表示将位图与文本基线对齐。接下来,我们创建了一个LeadingMarginSpan对象,并将其与ImageSpan对象一起添加到SpannableStringBuilder。最后,我们将SpannableStringBuilder显示在TextView

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值