Как применить цвет фона для ImageSpan в Android?

Я хочу динамически применять цвет фона для диапазона изображений в Android.

Не могли бы вы предложить какие-нибудь идеи?

3 ответа

Вы не можете использовать BackgroundColorSpan а также ImageSpanв то же время. Идея заключается в создании ImageSpan из LayerDrawable со слоями фона и изображения. Взгляните на следующий код:

Kotlin:

val span: Spannable = SpannableString("This is   ic launcher with background")
val myImage: Drawable = resources.getDrawable(R.drawable.ic_launcher_foreground)
val background = ShapeDrawable()
background.paint.color = Color.RED
val layerDrawable = LayerDrawable(arrayOf(background, myImage))
layerDrawable.setBounds(0, 0, 64, 64)
val image = ImageSpan(layerDrawable, ImageSpan.ALIGN_BASELINE)
span.setSpan(image, 8, 9, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)

textView.setText(span)


Ява:

Spannable span = new SpannableString("This is   ic launcher with background");
Drawable myImage = context.getResources().getDrawable(R.drawable.ic_launcher_foreground);
ShapeDrawable background = new ShapeDrawable();
background.getPaint().setColor(Color.RED);
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{background, myImage});
layerDrawable.setBounds(0, 0, 64, 64);
ImageSpan image = new ImageSpan(layerDrawable, ImageSpan.ALIGN_BASELINE);
span.setSpan(image, 8, 9, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

textView.setText(span);


Результат будет таким:

  1. Вы можете попробовать использовать BackgroundColorSpan с ImageSpan на ту же должность
  2. Вы можете создать изображение нужного вам цвета

Принятый ответ выполняет свою работу. Кроме того, если вы хотите создать LayerDrawable из XML, вот пример.

      [src/main/res/drawable/layer_drawable.xml]

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/your_color" />
        </shape>
    </item>

    <item android:drawable="@drawable/ic_your_image" />
</layer-list>
      [In your Fragment]

ResourcesCompat.getDrawable(resources, R.drawable.layer_drawable, null)?.let { layerDrawable ->
    val size = resources.getDimension(R.dimen.layer_drawable_size).toInt()
    layerDrawable.setBounds(0, 0, size, size)  // Not sure how to do this in XML.
    val imageSpan = ImageSpan(layerDrawable)
    ...
}
Другие вопросы по тегам