Я использую DraweeHolder в своем пользовательском представлении для отображения изображения. Когда я хочу обновить изображение с новым ресурсом, я создаю новый DraweeController, а затем setController для DraweeHolder.Фреска кроссфейдинг внутри DraweeHolder
То, что я пытаюсь реализовать, - это эффект кроссфейдинга между предыдущим и новым изображением. Для увядания в/из, я устанавливаюAlpha на возвращаемый рекурсивно.
void handleTransition(DraweeHolder draweeHolder, long startingTime) {
Drawable drawable = draweeHolder.getTopLevelDrawable().mutate();
int duration = 2000;
long currTime = System.currentTimeMillis();
int diff = (int) (currTime - startingTime);
int toAlpha = Math.max(0, 255 - (255 * diff/duration));
drawable.setAlpha(toAlpha);
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
Log.d(TAG, "onDraw()");
super.onDraw(canvas);
synchronized (this) {
handleTransition(draweeHolder, mCurrentTransStartTime);
}
}
Кажется, что все в порядке, за исключением того, что onDraw будет называться слишком много раз. Однако я не знаю, как мы можем одновременно отображать два изображения (crossfade) в этом DraweeHolder. Даже установка изображения высокого/низкого разрешения для DraweeHolder не дает возможности кроссфейдинга.
Btw, плательщик уже обеспечивает FadeDrawable, так что вам не нужно возиться с измерением времени и расчета альфа по своему усмотрению. – plamenko
Кроме того, чтобы ждать с кроссфейдингом, пока новое изображение не загрузится, вы можете установить прослушиватель контроллера и выполнить 'mFadeDrawable.fadeToLayer (mCurrentIndex)' в 'onFinalImageSet'. – plamenko
спасибо за ответ. Это хороший намек на использование FadeDrawable. Теперь он отлично работает. –