使用TextView和StaticLayout进行ImageSpan尺寸测量

时间:2017-01-02 06:49:44

标签: android textview imagespan staticlayout

我的简单布局只包含一个TextView

我想使用ImageSpan将图像加载到TextView

以下方法创建Spannable

private Spannable getImageSpannable(int drawableId, int targetWidth, int targetHeight) {

    Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), drawableId);

    Bitmap bitmap = Bitmap.createScaledBitmap(originalBitmap, targetWidth, targetHeight, true);
    Drawable dr = new BitmapDrawable(getResources(), bitmap);
    dr.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());

    Spannable imageSpannable = new SpannableString("\uFFFC");
    ImageSpan imgSpan = new ImageSpan(dr, DynamicDrawableSpan.ALIGN_BOTTOM);

    imageSpannable.setSpan(imgSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return imageSpannable;
}

我使用此方法创建如下内容:

public void setContent() {

    SpannableStringBuilder content = new SpannableStringBuilder();
    content.append(getImageSpannable(R.drawable.my_image, 100, 260));
    content.append("\n");

    txtContent.setText(content);
}

当我调用setContent()方法时,我的结果是这样的:

Small gap above ImageSpan

如您所见,ImageSpan与TextView的顶部之间存在微小差距。

这不是行间距,因为我将行间距设置为0。

有趣的是,当我删除" \ n"从content(在setContent方法中声明)这个空间消失了。

另一点是,当我尝试使用StaticLayout测量内容大小时,使用" \ n"在第0行的最后一个底部,它返回270而没有" \ n"它返回260。

这种行为给我带来了一些困难,因为我必须使用StaticLayout测量文本和ImageSpan,并决定一个人可以适应TextView

我感谢每个人都可以帮助我。

感谢。

这是我的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
    android:id="@+id/txtContent"
    android:layout_width="300dp"
    android:layout_height="500dp"
    android:background="#fed9f4"
    android:textSize="22sp"/>
</LinearLayout>

我做了一些测试,发现字体大小会影响ImageSpan渲染。

有人可以解释这种影响吗?

1 个答案:

答案 0 :(得分:0)

我希望这种方法有效

以下代码行

public void setContent() {

    SpannableStringBuilder content = new SpannableStringBuilder();
    content.append(getImageSpannable(R.drawable.my_image, 100, 260));
    content.append("\n");

    txtContent.setText(content);
}

更改为

public void setContent() {

    SpannableStringBuilder content = new SpannableStringBuilder();
    content.append(getImageSpannable(R.drawable.my_image, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    content.append("\n");

    txtContent.setText(content);
}

并调整大小&#34; R.drawable.my_image&#34;尺寸