gpt4 book ai didi

android - 如何在 Android TextViews 中设置 BlockQuotes 的样式?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:28 24 4
gpt4 key购买 nike

有没有办法格式化 <BlockQuote> Android TextView 中的 HTML 标记?如果我可以轻松地操作带有图像、广告和多个垂直滚动页面的 3 列,WebView 是一个选项。

TextView 显然处理标签,我得到一条丑陋的蓝线来表示 block 引用。有没有办法改变线条的颜色或提供我自己的线条图像更好?

最佳答案

如果您使用 android.text.Html#fromHtml 构建您的 android.text.Spannable,您的 blockquote 将使用 android.text.style.QuoteSpan。就是这个 QuoteSpan 不允许配置。

最简单的解决方案是在您的 Spannable 中搜索所有 QuoteSpan 并替换它们:

private void replaceQuoteSpans(Spannable spannable) {
QuoteSpan[] quoteSpans = spannable.getSpans(0, spanned.length(), QuoteSpan.class);
for (QuoteSpan quoteSpan : quoteSpans) {
int start = spannable.getSpanStart(quoteSpan);
int end = spannable.getSpanEnd(quoteSpan);
int flags = spannable.getSpanFlags(quoteSpan);
spannable.removeSpan(quoteSpan);
spannable.setSpan(new CustomQuoteSpan(
MY_BACKGROUND_COLOR,
MY_STRIPE_COLOR,
MY_STRIPE_WIDTH,
MY_GAP_WIDTH),
start,
end,
flags);
}
}

使用 CustomQuoteSpan 类,例如:

/**
* android.text.style.QuoteSpan hard-codes the strip color and gap. :(
*/
public class CustomQuoteSpan implements LeadingMarginSpan, LineBackgroundSpan {
private final int backgroundColor;
private final int stripeColor;
private final float stripeWidth;
private final float gap;

public CustomQuoteSpan(int backgroundColor, int stripeColor, float stripeWidth, float gap) {
this.backgroundColor = backgroundColor;
this.stripeColor = stripeColor;
this.stripeWidth = stripeWidth;
this.gap = gap;
}

@Override
public int getLeadingMargin(boolean first) {
return (int) (stripeWidth + gap);
}

@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom,
CharSequence text, int start, int end, boolean first, Layout layout) {
Paint.Style style = p.getStyle();
int paintColor = p.getColor();

p.setStyle(Paint.Style.FILL);
p.setColor(stripeColor);

c.drawRect(x, top, x + dir * stripeWidth, bottom, p);

p.setStyle(style);
p.setColor(paintColor);
}

@Override
public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) {
int paintColor = p.getColor();
p.setColor(backgroundColor);
c.drawRect(left, top, right, bottom, p);
p.setColor(paintColor);
}
}

关于android - 如何在 Android TextViews 中设置 BlockQuotes 的样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7717567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com