Giải thích bởi @Andro Selva là chính xác và không có nhiều việc phải làm. Frustratingly, mọi thứ trở nên tốt hơn cho API 24 và sau đó với sự bao gồm của cờ trong cuộc gọi
Spanned fromHtml (String source,
int flags,
Html.ImageGetter imageGetter,
Html.TagHandler tagHandler);
và tôi nghi ngờ FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH cờ sẽ làm giảm "\ n \ n" đôi của việc chấm dứt đoạn chuẩn đó của "\ n" đơn lẻ của ngắt dòng
Với lịch sử các phiên bản Android hiện có ~ Tôi không đủ khả năng viết phần mềm cho Android API 24+ độc quyền! Vì vậy, ... Tôi tìm thấy một giải pháp kludge với sự bao gồm của 2 thẻ tùy chỉnh thêm.
1. <scale factor="x.xx">... </scale>
2. <default>... </default>
cả gọi lớp RelativeSizeSpan thông qua phương pháp này
private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) {
int len = output.length();
if (opening) {
System.out.println("scalefactor open: " + scalefactor);
output.setSpan(new RelativeSizeSpan(scalefactor), len, len,
Spannable.SPAN_MARK_MARK);
} else {
Object obj = getLast(output, RelativeSizeSpan.class);
int where = output.getSpanStart(obj);
scalefactor = ((RelativeSizeSpan)obj).getSizeChange();
output.removeSpan(obj);
System.out.println("scalefactor close: " + scalefactor);
if (where != len) {
output.setSpan(new RelativeSizeSpan(scalefactor), where, len,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
được gọi là từ TagHandler tùy chỉnh cung cấp cho Html.fromHtml
phương pháp, tức là:
private static class CustomTagHandler implements Html.TagHandler {
private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) {
int len = output.length();
if (opening) {
//mSizeStack.push(scalefactor);
System.out.println("scalefactor open: " + scalefactor);
output.setSpan(new RelativeSizeSpan(scalefactor), len, len,
Spannable.SPAN_MARK_MARK);
} else {
Object obj = getLast(output, RelativeSizeSpan.class);
int where = output.getSpanStart(obj);
scalefactor = ((RelativeSizeSpan)obj).getSizeChange();
output.removeSpan(obj);
//scalefactor = (float)mSizeStack.pop();
System.out.println("scalefactor close: " + scalefactor);
if (where != len) {
output.setSpan(new RelativeSizeSpan(scalefactor), where, len,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
...
final HashMap<String, String> mAttributes = new HashMap<>();
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
String Attr;
processAttributes(xmlReader);
if ("default".equalsIgnoreCase(tag)) {
ProcessRelativeSizeTag(mDefaultTextSize, opening, output);
return;
}
if ("scale".equalsIgnoreCase(tag)) {
Attr = mAttributes.get("factor");
if (Attr != null && !Attr.isEmpty()) {
float factor = parseFloat(Attr);
if (factor > 0)
ProcessRelativeSizeTag(factor, opening, output);
}
return;
...
}
}
Để sử dụng, tôi đặt kích thước văn bản của đối tượng Textview
đến 1. Tức là, 1 pixel! Sau đó tôi đặt kích thước văn bản đúng theo yêu cầu trong biến mDefaultTextSize
. Tôi có tất cả các chức năng Html bên trong một htmlTextView
kéo dài TextView
như:
public class htmlTextView extends AppCompatTextView {
static Typeface mLogo;
static Typeface mGAMZ;
static Typeface mBrush;
static Typeface mStandard;
int GS_PAINTFLAGS = FILTER_BITMAP_FLAG | ANTI_ALIAS_FLAG | SUBPIXEL_TEXT_FLAG | HINTING_ON;
static float mDefaultTextSize;
static Typeface mDefaultTypeface;
etc
}
trong đó bao gồm các phương pháp công
public void setDefaultTextMetrics(String face, float defaultTextSize) {
mDefaultTypeface = mStandard;
if (face != null) {
if ("gamz".equalsIgnoreCase(face)) {
mDefaultTypeface = mGAMZ;
} else {
if ("brush".equalsIgnoreCase(face)) {
mDefaultTypeface = mBrush;
}
}
}
setTypeface(mDefaultTypeface);
setTextSize(1);
mDefaultTextSize = defaultTextSize;
}
Một ((htmlTextView)tv).setDefaultTextMetrics(null, 30);
gọi đơn giản đặt htmlTextView
tôi để sử dụng kiểu chữ tiêu chuẩn của tôi mặc định với kích thước văn bản là 30.
Sau đó, khi tôi g ive it ví dụ này để sử dụng trong fromHtml:
<string name="htmlqwert">
<![CDATA[
<p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p>
<p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p>
<p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p>
<p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p>
]]>
</string>
thẻ tùy chỉnh của tôi <box>
chỉ cho phép tôi làm nổi bật nền của văn bản. Xem hình ảnh đính kèm, cho thấy một kết quả bằng cách sử dụng thẻ <default>
với kích thước TextView
văn bản thiết lập để 1 và <default>
thẻ gọi một RelevantSizeSpan
bởi một yếu tố của 30, và một với:
<string name="htmlqwert">
<![CDATA[
<p><scale factor="1.5"><box> qwertQWERT </box></scale></p>
<p><scale factor="1.5"><box>qwertQWERT</box></scale></p>
<p><scale factor="1.5"><box>qwertQWERT</box></scale></p>
<p><scale factor="1.5"><box>qwertQWERT</box></scale></p>
]]>
</string>
sử dụng không <default>
thẻ nhưng thiết thay vào đó, kích thước văn bản TextView
là 30. Trong trường hợp đầu tiên, dòng mới bổ sung vẫn ở đó nhưng nó chỉ cao 1 pixel!
NB Không có điểm thực nào cho các thẻ <scale factor="1.5">...</scale>
. Chúng chỉ còn sót lại trên các đồ tạo tác từ các thử nghiệm khác.
Kết quả: Cả hai ví dụ bên dưới đều có 2 dòng mới giữa các đoạn văn, nhưng ở phía bên trái, một trong những dòng này chỉ cao 1 pixel. Tôi sẽ để nó cho người đọc để tìm ra cách để giảm nó thành 0, nhưng không sử dụng kích thước văn bản của 0
bất kỳ ảnh chụp màn hình nào liên quan đến sự khác biệt sẽ hữu ích tôi đoán –
thêm ảnh chụp màn hình! –