在Android画布中绘制包含HTML代码的StaticLayout文本

问题描述 投票:0回答:1

让像这样的多行HTML文本:<div style="color: red;"><b>foo</b></div>。它可以是多线的,因为这些条件中至少有一个是真的:a)文本很长或b)至少有一个<br />

目的是在画布中绘制此文本,该画布使用Bitmap构建。

我写的最小代码如下(android.graphics.Canvasandroid.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应用程序解释此代码?

android android-canvas staticlayout
1个回答
0
投票
StaticLayout.Builder.obtain.obtain(caption, 0, caption.length(), mTextPaint, bitmap.getWidth()).build() ;

在doc中,第一个参数是“source CharSequence:要布局的文本,可选择带有跨度。此值绝不能为空。”(https://developer.android.com/reference/kotlin/android/text/StaticLayout.Builder#obtain

所以不要传递一串html代码,而是一个带有代表解释html的跨度的charsequence。为此,应该使用Html.fromHtml(https://developer.android.com/reference/android/text/Html.html#fromHtml(java.lang.String,%20int))。

注意:这个答案是不完整的:即使使用标志<b style="color: rgb(255, 0, 0);">Rrr</b>,像Html.FROM_HTML_OPTION_USE_CSS_COLORS这样的HTML也会被解释为没有颜色。

© www.soinside.com 2019 - 2024. All rights reserved.