カスタム ビューで DraweeHolder を使用して画像を表示しています。イメージを新しいリソースで更新したい場合は、新しい DraweeController を作成してから、Controller を 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 が何度も呼び出されることを除けば、うまく機能しているようです。ただし、この DraweeHolder で 2 つの画像を同時に (クロスフェード) 表示する方法がわかりません。DraweeHolder に高/低解像度の画像を設定しても、クロスフェードのオプションはありません。