自定义从 Html 字符串引用的图像

Posted

技术标签:

【中文标题】自定义从 Html 字符串引用的图像【英文标题】:Customize Image referred From Html string 【发布时间】:2013-06-16 08:51:23 【问题描述】:

我的一个项目活动包括用 string.xml 编写的长文本,我从 textview 中的资源添加一些图像,因为每个短语之后都有图像,然后是文本短语,然后是图像等等,

我使用此代码从字符串中获取图像:

public class MainActivity extends Activity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView htmlTextView = (TextView) findViewById(R.id.day_tv);
        htmlTextView.setText(Html.fromHtml(getString(R.string.day), new ImageGetter(), null));
    

    private class ImageGetter implements Html.ImageGetter 

        public Drawable getDrawable(String source) 
            int id = 0;
            if (source.equals("image1.jpg")) 
                id = R.drawable.a;
             else if (source.equals("image2.jpg")) 
                id = R.drawable.b;
             else if (source.equals("image3.jpg")) 
                id = R.drawable.c;
             else if (source.equals("image4.jpg")) 
                id = R.drawable.d;
             else if (source.equals("image5.jpg")) 
                id = R.drawable.e;
            

            Drawable d = getResources().getDrawable(id);
            d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
            return d;
        
    ;


在string.xml中写html img标签为:

<img src="image1.jpg">

我希望能够通过更改其宽度和高度来自定义每个图像,或者将其引用为可绘制样式以在图像周围添加边框。

我尝试使用波纹管代码来改变宽度和高度:

<img src="image1.jpg"  > 

但它不起作用。

任何实现这一目标的建议将不胜感激,谢谢。

【问题讨论】:

是什么不工作?对我来说,真的很难理解你的问题——也许我不是唯一一个,因为没有人费心评论你的问题或给你答案。也许您应该尝试重新表述您的问题。你到底想达到什么目的?你为什么把html放在TextViews里面? @Darwind 我正在编辑帖子,请检查它 你想为每张图片设置不同的宽度和高度吗? @blackbelt 是的,亲爱的,每个图像的宽度和高度都不同,谢谢 并且宽度/高度与drawable的不同? 【参考方案1】:

我终于得到了这个解决方案,它允许更改每个图像的宽度和高度,但仍然没有实现一个点,即将图像引用为可绘制形状作为背景, 仍在努力:

 private class ImageGetter implements Html.ImageGetter 

    public Drawable getDrawable(String source) 
        int id,id1,id2,id3,id4 = 0;

        if (source.equals("image1.jpg")) 
            id = R.drawable.a;
            Drawable d = getResources().getDrawable(id);
            d.setBounds(0, 0, 80, 20);
         return d;
                    
        else if (source.equals("image2.jpg")) 
            id1 = R.drawable.b;
            Drawable d1 = getResources().getDrawable(id1);
            d1.setBounds(0, 0, 100, 40);
         return d1;
                    
        else if (source.equals("image3.jpg")) 
            id2 = R.drawable.c;
            Drawable d2 = getResources().getDrawable(id2);
            d2.setBounds(0, 0, 120, 60);
         return d2; 
                   
         else if (source.equals("image4.jpg")) 
            id3 = R.drawable.d;                      
            Drawable d3 = getResources().getDrawable(id3);
            d3.setBounds(0, 0, 140, 80);           
        return d3;
         
         else if (source.equals("image5.jpg")) 
             id4 = R.drawable.e;                      
             Drawable d4 = getResources().getDrawable(id4);
             d4.setBounds(0, 0, 160, 100);            
         return d4;
     
        return null;
       ;
      
    

【讨论】:

【参考方案2】:

问题来自Html.fromHtml(),它只支持very limited set of tags and attributes。支持&lt;img&gt;,但不支持设置图片的宽高。可以使用TextView(通过使用SpannableStringImageSpan)来实现它,但是它更复杂并且不是很灵活。

相反,您应该使用正确处理 HTML 的WebView

加载字符串很容易:

WebView webView = (WebView) findViewById(R.id.web_view);
webView.loadData(getResources(R.string.day), "text/html", null);

您可以找到更多示例in the documentation。


只是为了比较,这里是一个没有使用WebView的例子:

protected void onCreate(Bundle savedInstanceState) 
    ...
    TextView textView = (TextView) findViewById(R.id.text_view);
    SpannableString ss = new SpannableString("Hello :)");

    // Draw the image with a size of 50x50
    Drawable d = getResources().getDrawable(R.drawable.happy_face);
    d.setBounds(0, 0, 50, 50);

    // Replace the ":)" in the string by our drawable
    ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
    ss.setSpan(span, 6, 8, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(ss);

它会加载得更快,但你不能使用 HTML。

【讨论】:

在我的项目开始时,我尝试使用 webview 而不是 textview,但我发现带有 html 标签的 textview 更容易,因为当时我不熟悉 webview,我的文本太长并且已经完成了自定义string.xml ,如果没有其他方法,我必须用 webview 重新启动,谢谢亲爱的 请不要在 ImageGetter 类中为每个自定义图像,谢谢 我编辑了我的答案,虽然我不能 100% 确定它会起作用。 它给了我强制关闭(java.lang.RuntimeException)和错误显示到这一行:htmlTextView.setText(Html.fromHtml(getString(R.string.day), new ImageGetter(), null )); 你有关于这个错误的更多细节吗?但是,如果您以后想为图像添加其他样式(边框,...),您真的应该选择WebView

以上是关于自定义从 Html 字符串引用的图像的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Antlr4 中实现带有自定义分隔符的 q 引用字符串

Notepad++ HTML 自定义标签不高亮属性字符串

引用自定义组件的设计时程序集

是否有不错的,可自定义的Markdown Java API HTML?

使用 C# 从 html 中删除自定义 xml 标签

BlackBerry Cascades 中的 QML 字符串