0

カスタム ビューで 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 に高/低解像度の画像を設定しても、クロスフェードのオプションはありません。

4

1 に答える 1

2

あなたは正しい軌道に乗っています。カスタム ビューを作成する必要があります (たとえば、 を拡張してImageView)。名宛人が正しく機能するためには、いくつかのことを配線する必要があることに注意してください。その方法については、こちらをお読みください。

2つ必要ですDraweeHolders。複数のホルダーを使用する場合は、次のように保管することをお勧めしますMultiDraweeHolder

  private void init() {
    mMultiDraweeHolder = new MultiDraweeHolder<GenericDraweeHierarchy>();
    // holders for the two images to cross-fade between
    Drawable drawables[] = new Drawable[2];
    for (int i = 0; i < drawables.length; i++) {
      GenericDraweeHierarchy hierarchy = createDraweeHierarchy();
      mMultiDraweeHolder.add(DraweeHolder.create(hierarchy, getContext()));
      drawables[i] = hierarchy.getTopLevelDrawable();
    }
    mFadeDrawable = new FadeDrawable(drawables);
    // no need to override onDraw, ImageView superclass will correctly draw our fade drawable if we set it like this:
    super.setImageDrawable(mFadeDrawable);
    mCurrentIndex = 0;
  }

  void loadNextImage(DraweeController controller) {
    mCurrentIndex = (mCurrentIndex + 1) % 2;
    mMultiDraweeHolder.get(mCurrentIndex).setController(controller);
    mFadeDrawable.fadeToLayer(mCurrentIndex);
  }

  GenericDraweeHierarchy createDraweeHierarchy() {
    // create a new drawee hierarchy here,
    // as each image needs to have its own instance
  }
于 2016-01-27T17:11:06.763 に答える