Android 为跨文本添加填充
Android add padding for spanned text
在我的应用中,我获取并解析 html 内容并使用 Spanned 显示它。
我这样使用 Spanned:
String html = "<p>Html Content</p>"
Spanned htmlSpan = Html.fromHtml(html, imageParser, null);
我试过使用 apache commons library 来设置 padding 但它没有用。
有没有办法设置左右填充?
编辑:忘了说了,我在那个 html 内容里也有图片。我尝试向 TextView 本身添加填充,但那样一来,所有图像也都有填充。
一般来说,显示 HTML 的最简单解决方案是使用 WebView
。这不是最好的解决方案,但它也适用于 css 和 javascript.
要在 TextView
中的跨文本上应用填充,您可以使用 <blockquote>
,Html.fromHtml()
将转换为 QuoteSpan
。如果您不喜欢该跨度的格式,您可以替换它并添加您自己的 LeadingMarginSpan
实现。通过添加 TagHandler
来创建和处理您自己的 spannable 字符串上的标记,同样可以工作。
您可以使用如下方式搜索和替换跨度
QuoteSpan[] spans = text.getSpans(0, text.length(), QuoteSpan.class);
text.setSpan(YOUR_SPAN, text.getSpanStart(spans[0]), text.getSpanEnd(spans[0]), 0);
使用 span 的文档很少,教程也很少,但您可以查看 this 进一步阅读。
我选择了艰难的道路
https://developer.android.com/reference/android/text/style/QuoteSpan#quotespan
它表明 Android P Developer Preview 将具有以下构造函数
QuoteSpan (int color,
int stripeWidth,
int gapWidth)
多么不幸
因此,唯一的方法是按照 David 的预期实施新的 QuoteText。幸运的是 Android 是开源的。
AndroidP源在哪里?我还是找不到它。
复制源代码然后实现构造函数。
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Parcel;
import android.support.annotation.ColorInt;
import android.text.Layout;
import android.text.ParcelableSpan;
import android.text.TextUtils;
import android.text.style.LeadingMarginSpan;
// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/QuoteSpan.java
public class MyQuoteSpan implements LeadingMarginSpan, ParcelableSpan {
private int mStripWidth = 2;
private int mGapWidth = 2;
private final int mColor;
public MyQuoteSpan() {
super();
mColor = 0xff0000ff;
}
public MyQuoteSpan(@ColorInt int color, int stripeWidth, int gapWidth) {
super();
mColor = color;
mStripWidth = stripeWidth;
mGapWidth = gapWidth;
}
public MyQuoteSpan(Parcel src) {
mColor = src.readInt();
}
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
/** @hide */
public int getSpanTypeIdInternal() {
//return TextUtils.QUOTE_SPAN;
return 9;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
writeToParcelInternal(dest, flags);
}
/** @hide */
public void writeToParcelInternal(Parcel dest, int flags) {
dest.writeInt(mColor);
}
@ColorInt
public int getColor() {
return mColor;
}
public int getLeadingMargin(boolean first) {
return mStripWidth + mGapWidth;
}
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 color = p.getColor();
p.setStyle(Paint.Style.FILL);
p.setColor(mColor);
c.drawRect(x, top, x + dir * mStripWidth, bottom, p);
p.setStyle(style);
p.setColor(color);
}
}
终于用上了
String html = "<blockquote>Html Content</blockquote>";
Spannable contentNative;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
contentNative = (Spannable)Html.fromHtml(content, Html.FROM_HTML_MODE_COMPACT, null, null);
} else {
contentNative = (Spannable)Html.fromHtml(content, null, null);
}
QuoteSpan[] quoteSpans = contentNative.getSpans(0, contentNative.length(), QuoteSpan.class);
int primaryColor = ResourcesCompat.getColor(getResources(), R.color.colorPrimary, null);
int quoteStripWidth = 2;
int quoteGapWidth = 8;
for (int i = 0, len = quoteSpans.length; i < len; i++) {
MyQuoteSpan newSpan = new MyQuoteSpan(primaryColor, quoteStripWidth, quoteGapWidth);
int start = contentNative.getSpanStart(quoteSpans[i]);
int end = contentNative.getSpanEnd(quoteSpans[i]);
contentNative.removeSpan(quoteSpans[i]);
contentNative.setSpan(newSpan, start, end, 0);
}
在我的应用中,我获取并解析 html 内容并使用 Spanned 显示它。 我这样使用 Spanned:
String html = "<p>Html Content</p>"
Spanned htmlSpan = Html.fromHtml(html, imageParser, null);
我试过使用 apache commons library 来设置 padding 但它没有用。
有没有办法设置左右填充?
编辑:忘了说了,我在那个 html 内容里也有图片。我尝试向 TextView 本身添加填充,但那样一来,所有图像也都有填充。
一般来说,显示 HTML 的最简单解决方案是使用 WebView
。这不是最好的解决方案,但它也适用于 css 和 javascript.
要在 TextView
中的跨文本上应用填充,您可以使用 <blockquote>
,Html.fromHtml()
将转换为 QuoteSpan
。如果您不喜欢该跨度的格式,您可以替换它并添加您自己的 LeadingMarginSpan
实现。通过添加 TagHandler
来创建和处理您自己的 spannable 字符串上的标记,同样可以工作。
您可以使用如下方式搜索和替换跨度
QuoteSpan[] spans = text.getSpans(0, text.length(), QuoteSpan.class);
text.setSpan(YOUR_SPAN, text.getSpanStart(spans[0]), text.getSpanEnd(spans[0]), 0);
使用 span 的文档很少,教程也很少,但您可以查看 this 进一步阅读。
我选择了艰难的道路
https://developer.android.com/reference/android/text/style/QuoteSpan#quotespan
它表明 Android P Developer Preview 将具有以下构造函数
QuoteSpan (int color,
int stripeWidth,
int gapWidth)
多么不幸
因此,唯一的方法是按照 David 的预期实施新的 QuoteText。幸运的是 Android 是开源的。
AndroidP源在哪里?我还是找不到它。
复制源代码然后实现构造函数。
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Parcel;
import android.support.annotation.ColorInt;
import android.text.Layout;
import android.text.ParcelableSpan;
import android.text.TextUtils;
import android.text.style.LeadingMarginSpan;
// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/QuoteSpan.java
public class MyQuoteSpan implements LeadingMarginSpan, ParcelableSpan {
private int mStripWidth = 2;
private int mGapWidth = 2;
private final int mColor;
public MyQuoteSpan() {
super();
mColor = 0xff0000ff;
}
public MyQuoteSpan(@ColorInt int color, int stripeWidth, int gapWidth) {
super();
mColor = color;
mStripWidth = stripeWidth;
mGapWidth = gapWidth;
}
public MyQuoteSpan(Parcel src) {
mColor = src.readInt();
}
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
/** @hide */
public int getSpanTypeIdInternal() {
//return TextUtils.QUOTE_SPAN;
return 9;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
writeToParcelInternal(dest, flags);
}
/** @hide */
public void writeToParcelInternal(Parcel dest, int flags) {
dest.writeInt(mColor);
}
@ColorInt
public int getColor() {
return mColor;
}
public int getLeadingMargin(boolean first) {
return mStripWidth + mGapWidth;
}
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 color = p.getColor();
p.setStyle(Paint.Style.FILL);
p.setColor(mColor);
c.drawRect(x, top, x + dir * mStripWidth, bottom, p);
p.setStyle(style);
p.setColor(color);
}
}
终于用上了
String html = "<blockquote>Html Content</blockquote>";
Spannable contentNative;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
contentNative = (Spannable)Html.fromHtml(content, Html.FROM_HTML_MODE_COMPACT, null, null);
} else {
contentNative = (Spannable)Html.fromHtml(content, null, null);
}
QuoteSpan[] quoteSpans = contentNative.getSpans(0, contentNative.length(), QuoteSpan.class);
int primaryColor = ResourcesCompat.getColor(getResources(), R.color.colorPrimary, null);
int quoteStripWidth = 2;
int quoteGapWidth = 8;
for (int i = 0, len = quoteSpans.length; i < len; i++) {
MyQuoteSpan newSpan = new MyQuoteSpan(primaryColor, quoteStripWidth, quoteGapWidth);
int start = contentNative.getSpanStart(quoteSpans[i]);
int end = contentNative.getSpanEnd(quoteSpans[i]);
contentNative.removeSpan(quoteSpans[i]);
contentNative.setSpan(newSpan, start, end, 0);
}