@Andro Selva による説明は正しく、それについてやるべきことはあまりありません。イライラすることに、呼び出しにフラグを含めることで、API 24 以降では状況が改善されます。
Spanned fromHtml (String source,
int flags,
Html.ImageGetter imageGetter,
Html.TagHandler tagHandler);
FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPHフラグは、標準の段落終了の二重の「\n\n」を、改行の単一の「\n」のそれに減らすと思います
Android バージョンの歴史を考えると、Android API 24+ 専用のソフトウェアを作成する余裕はありません。だから...私は2つの追加のカスタムタグを含むクラッジソリューションを見つけました。
1. <scale factor="x.xx">... </scale>
2. <default>... </default>
両方とも、このメソッドを介して RelativeSizeSpan クラスを呼び出します
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);
}
}
}
Html.fromHtml
これは、メソッドに提供されたカスタム TagHandler から呼び出されます。
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;
...
}
}
使用するために、オブジェクトのテキスト サイズを 1 に設定しますTextview
。つまり、1 ピクセルです。次に、必要な実際のテキスト サイズを変数に設定しますmDefaultTextSize
。htmlTextView
次のように拡張するすべての Html 機能を内部に持っていますTextView
。
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
}
public メソッドを含む
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;
}
簡単な((htmlTextView)tv).setDefaultTextMetrics(null, 30);
呼び出しでhtmlTextView
、標準の書体をテキスト サイズ 30 でデフォルトとして使用するように my を設定します。
次に、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>
カスタム タグ<box>
を使用すると、テキストの背景を強調表示できます。添付の図を参照してください。テキスト サイズが 1 に設定されたタグと 30 倍で aを呼び出す<default>
タグを使用した 1 つの結果と、次の結果が示されています。TextView
<default>
RelevantSizeSpan
<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>
<default>
タグを使用せず、TextView
代わりにテキスト サイズを 30 に設定します。最初のケースでは、余分な新しい行がまだ残っていますが、高さは 1 ピクセルしかありません!
NB<scale factor="1.5">...</scale>
タグには本当の意味はありません。それらは、他のテストからのアーティファクトが残っているだけです。
結果:以下の両方の例では、段落間に 2 つの改行がありますが、左側の例では、それらの行の 1 つが高さ 1 ピクセルしかありません。ゼロに減らす方法を理解するために読者に任せますが、テキストサイズを 0 にしないでください。