Android显示图像在TextView与SpannableStringBuilder语言 - 没有错误,但没有图像,只是纯文



基本上我有一个这样的段落

导带低能级差值$ec价带$ev的上能级称为能带差距。

现在我正试图解析文本,以获得那些$前缀的符号,并将它们替换为数学公式的小PNG图像。它们只是像Ev和Ec一样的单/dbl字母常量符号。它们在我的资产文件夹中。基本上这就是代码

public SpannableStringBuilder getConstants(String desc, String constpath){
    SpannableStringBuilder builder = new SpannableStringBuilder();
    if (desc.contains("$")){
        Matcher matcher = Pattern.compile("\$\w+").matcher(desc);
        int lastEnding=0;
        while (matcher.find()) {
            String constName = matcher.group();
            constName = constName.substring(1,constName.length());
            int startIndex = matcher.start();
            int endIndex = matcher.end();
            String brokenDescFirstPart = desc.substring(lastEnding, startIndex - 1);
            lastEnding = endIndex+1;
            builder.append(brokenDescFirstPart).append("   ");
            try{
                InputStream imgStream = getContext().getAssets().open(constpath+constName+".png");
                Drawable dconstImg = Drawable.createFromStream(imgStream, null);
                imgStream.close();
                builder.setSpan(new ImageSpan(dconstImg,ImageSpan.ALIGN_BOTTOM), builder.length() -3, builder.length() -1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append("  ");
            }catch (Exception e){
                builder.append(" ");
            }
        }
        String brokenDescLastPart = desc.substring(lastEnding, desc.length() - 1);
        builder.append(brokenDescLastPart);
    }else{
        builder = SpannableStringBuilder.valueOf(desc);
    }
    return builder;
}

快速总结代码,desc是我要解析的字符串。然后使用regex获取$word模式并使用匹配器。Match 方法迭代文本。我使用一些int变量来跟踪这些符号之间的起点和终点,以仔细地重建嵌入图像的原始字符串。现在代码

try{
                InputStream imgStream = getContext().getAssets().open(constpath+constName+".png");
                Drawable dconstImg = Drawable.createFromStream(imgStream, null);
                imgStream.close();
                builder.setSpan(new ImageSpan(dconstImg,ImageSpan.ALIGN_BOTTOM), builder.length() -3, builder.length() -1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append("  ");
            }catch (Exception e){
                builder.append(" ");
            }

是我问题的关键。我是从其他问题中得到的。他们说这很有效。但在我的脑子里却没有。我在所有代码中都设置了断点,并逐行执行。没有错误,什么都没有。还是不行。

文本加载额外的空间在textview,我已经故意用来识别它必须注入图像的地方。我的TextView是Android Studio中的小文本视图小部件。

我终于找到了问题所在。原来所有的drawables 必须被setBounds()方法初始化。这是我最后的代码

InputStream imgStream = getContext().getAssets().open(constpath + constName + ".png");
                Drawable dconstImg = Drawable.createFromStream(imgStream, null);
                imgStream.close();
                float aspectRatio = (float) (1.00 * dconstImg.getIntrinsicWidth() / dconstImg.getIntrinsicHeight());
                dconstImg.setBounds(0, 0, (int) Math.ceil(descTextSize * aspectRatio), (int) Math.ceil(descTextSize));
                int alignment = s ? ImageSpan.ALIGN_BOTTOM : ImageSpan.ALIGN_BASELINE;
                builder.setSpan(new ImageSpan(dconstImg,alignment), builder.length() -1, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append(" ");

descTextSize是TextView.getTextSize()的结果

谢谢大家帮我解决这个问题。

当你可以使用setCompundDrawblesWithIntrinsicBounds时,为什么要生成文本?拆分段落并为其附加唯一的ID。在下面的例子;

InputStream imgStream = getContext().getAssets().open(constpath+constName+".png");
Drawable dconstImg = Drawable.createFromStream(imgStream, null);    
if ( Build.VERSION.SDK_INT >= 21 )
{
    text_you_want_to_add_drawable_to.setCompoundDrawablesWithIntrinsicBounds( dconstImg, null ), null, null, null );
} else
{
    text_you_want_to_add_drawable_to.setCompoundDrawablesWithIntrinsicBounds( dconstImg, null, null, null );
}

相关内容

  • 没有找到相关文章

最新更新