Правильный способ вызвать обновление в пользовательском объекте рисования внутри textSpan
Я написал пользовательский промежуток для SpannableStrings
"ImageURLSpan
"Это расширяет ImageSpan
,
- ImageSpan настроен с Drawable "
RemoteImageDrawable
"который отображает статический заполнитель, загружает изображение из Интернета, затем, когда изображение завершает загрузку, он должен отображать загруженный растровый рисунок вместо заполнителя. Это произойдет, еслиdraw()
метод drawable вызывается снова (от родителяview
?)
Моя проблема заключается в том, что на уровне рисования я не знаю, как вызвать автоматическое обновление в любой момент в будущем (после загрузки изображения). Я пытался вызвать родительское представление invalidate
с непоследовательными результатами: иногда метод draw объекта drawable вызывается снова, поэтому он обновляется должным образом, а иногда - нет. Это совершенно случайно!
Каков правильный подход для рисования, которое меняет свое содержимое на "аннулирование" самого себя? не должна ли недействительность родительского представления приводить к недействительности всех дочерних объектов? Нужно ли использовать обратные вызовы Drawable или они не связаны с моей проблемой?
Пожалуйста, найдите прикрепленный соответствующий код:
public class ImageUrlSpan extends ImageSpan {
public ImageUrlSpan(final View parentView, String imageUrl, int width, int height) {
super(
new RemoteImageDrawable(
parentView, imageUrl, width, height, new ImageLoaders.OnDrawableDownloadListener() {
@Override
public void onDrawableLoaded(Drawable bitmap) {
parentView.invalidate();
// this works sometimes
if (Conf.LOG_ON) Log.v(TAG, "Invalidating parent view... will that refresh myself? "+parentView);
}
}
));
}
}
О коде RemoteImageDrawable
, вам нужно только знать
это простая отрисовка, которая просто рисует заполнитель, планирует загрузку изображения, а затем, когда изображение готово, вызывает слушателя выше.
Всякий раз, когда его
draw
метод вызывается снова (предположительно как следствие недействительности в слушателе выше), загруженный битовый массив будет отображаться вместо заполнителя.Я опущу исходный код для простоты, проблема настолько проста, что метод draw не вызывается в большинстве случаев. Меня удивляет, что иногда это называется!
Следующая трассировка стека изображает стек вызовов первого вызова DRAW Drawable. Вы можете видеть, что это происходит из View.draw() -> StaticLayout.draw() -> RemoteImageDrawable.draw().
W/System.err(26142): at com.regaliz.custom.RemoteImageDrawable.draw(RemoteImageDrawable.java:71)
W/System.err(26142): at android.text.style.DynamicDrawableSpan.draw(DynamicDrawableSpan.java:107)
W/System.err(26142): at android.text.TextLine.handleReplacement(TextLine.java:854)
W/System.err(26142): at android.text.TextLine.handleRun(TextLine.java:937)
W/System.err(26142): at android.text.TextLine.drawRun(TextLine.java:395)
W/System.err(26142): at android.text.TextLine.draw(TextLine.java:193)
W/System.err(26142): at android.text.Layout.drawText(Layout.java:348)
W/System.err(26142): at android.text.Layout.draw(Layout.java:205)
W/System.err(26142): at android.text.Layout.draw(Layout.java:183)
W/System.err(26142): at com.regaliz.gui.views.SimpleTextView.drawTextLayout(SimpleTextView.java:347)
W/System.err(26142): at com.regaliz.gui.views.SimpleTextView.onDraw(SimpleTextView.java:310)
W/System.err(26142): at com.regaliz.gui.views.helper.SimpleTextViewMarquee.onDraw(SimpleTextViewMarquee.java:114)
W/System.err(26142): at android.view.View.draw(View.java:13877)
W/System.err(26142): at android.view.View.getDisplayList(View.java:12815)
W/System.err(26142): at android.view.View.getDisplayList(View.java:12859)
W/System.err(26142): at android.view.View.draw(View.java:13593)
W/System.err(26142): at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
W/System.err(26142): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
Однако, когда я выдаю недействительный объект, drawable draw() не вызывается, поэтому где-то по этому пути представление решает, что все уже нарисовано:(
V/RemoteImageDrawable(26142): *** Remote bitmap loaded com.regaliz.util.AssetLoader$MeasuredBitmapDrawable@41d60798
V/ImageURLSpan(26142): Invalidating parent view after loaded... will it work? com.regaliz.gui.views.helper.SimpleTextViewMarquee{41f6c898 GFED..CL ........ 0,0-719,663}
V/ImageURLSpan(26142): Invalidating parent view end.