在 Android canvas 中绘制包含 HTML 代码的 StaticLayout 文本
Draw StaticLayout text including HTML code in an Android canvas
让多行 HTML 文本像这样:<div style="color: red;"><b>foo</b></div>
。它可以是多行的,因为至少有一个条件为真:a) 文本很长或 b) 至少有一个 <br />
.
目的是在 canvas 中绘制此文本,该 canvas 使用 Bitmap
.
构造
我编写的最少代码如下(android.graphics.Canvas
、android.graphics.drawable.BitmapDrawable
...):
private BitmapDrawable addTextOnImage(BitmapDrawable bitmapDrawable) {
Bitmap bitmap = ...;
String caption = rich_editor_caption.getHtml();
StaticLayout mTextLayout_caption = StaticLayout.Builder.obtain(caption, 0, caption.length(), mTextPaint, bitmap.getWidth()).build();
Bitmap final_bitmap = Bitmap.createBitmap(bitmap.getWidth(), mTextLayout_caption.getHeight() + bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(final_bitmap);
mTextLayout_caption.draw(canvas);
return new BitmapDrawable(getActivity().getResources(), final_bitmap);
}
如果变量caption
包含HTML代码,后者将不会被解释。换句话说:标签实际上会显示在结果图像中。
是否可以让 Android 应用程序解释此代码?
StaticLayout.Builder.obtain.obtain(caption, 0, caption.length(), mTextPaint, bitmap.getWidth()).build() ;
在文档中,第一个参数是“source CharSequence:
要布局的文本,可选择带有 span 此值绝不能为空。” (https://developer.android.com/reference/kotlin/android/text/StaticLayout.Builder#obtain)
所以不要向它传递一个 html 代码的字符串,而是一个具有表示已解释 html 跨度的字符序列。为此,应该使用 Html.fromHtml ( https://developer.android.com/reference/android/text/Html.html#fromHtml(java.lang.String,%20int)).
注意:此答案不完整:即使使用标志 Html.FROM_HTML_OPTION_USE_CSS_COLORS
,HTML 和 <b style="color: rgb(255, 0, 0);">Rrr</b>
一样将被解释为没有颜色。
让多行 HTML 文本像这样:<div style="color: red;"><b>foo</b></div>
。它可以是多行的,因为至少有一个条件为真:a) 文本很长或 b) 至少有一个 <br />
.
目的是在 canvas 中绘制此文本,该 canvas 使用 Bitmap
.
我编写的最少代码如下(android.graphics.Canvas
、android.graphics.drawable.BitmapDrawable
...):
private BitmapDrawable addTextOnImage(BitmapDrawable bitmapDrawable) {
Bitmap bitmap = ...;
String caption = rich_editor_caption.getHtml();
StaticLayout mTextLayout_caption = StaticLayout.Builder.obtain(caption, 0, caption.length(), mTextPaint, bitmap.getWidth()).build();
Bitmap final_bitmap = Bitmap.createBitmap(bitmap.getWidth(), mTextLayout_caption.getHeight() + bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(final_bitmap);
mTextLayout_caption.draw(canvas);
return new BitmapDrawable(getActivity().getResources(), final_bitmap);
}
如果变量caption
包含HTML代码,后者将不会被解释。换句话说:标签实际上会显示在结果图像中。
是否可以让 Android 应用程序解释此代码?
StaticLayout.Builder.obtain.obtain(caption, 0, caption.length(), mTextPaint, bitmap.getWidth()).build() ;
在文档中,第一个参数是“source CharSequence:
要布局的文本,可选择带有 span 此值绝不能为空。” (https://developer.android.com/reference/kotlin/android/text/StaticLayout.Builder#obtain)
所以不要向它传递一个 html 代码的字符串,而是一个具有表示已解释 html 跨度的字符序列。为此,应该使用 Html.fromHtml ( https://developer.android.com/reference/android/text/Html.html#fromHtml(java.lang.String,%20int)).
注意:此答案不完整:即使使用标志 Html.FROM_HTML_OPTION_USE_CSS_COLORS
,HTML 和 <b style="color: rgb(255, 0, 0);">Rrr</b>
一样将被解释为没有颜色。