2016-01-26 1 views
0

Я использую 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 не дает возможности кроссфейдинга.

ответ

2

Вы на правильном пути. Вам нужно будет написать собственное представление (например, путем расширения ImageView). Имейте в виду, что вам нужно связать некоторые вещи, чтобы Drawee работал правильно, прочитайте here, как это сделать.

Вам понадобятся два 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 
    } 
+0

Btw, плательщик уже обеспечивает FadeDrawable, так что вам не нужно возиться с измерением времени и расчета альфа по своему усмотрению. – plamenko

+0

Кроме того, чтобы ждать с кроссфейдингом, пока новое изображение не загрузится, вы можете установить прослушиватель контроллера и выполнить 'mFadeDrawable.fadeToLayer (mCurrentIndex)' в 'onFinalImageSet'. – plamenko

+0

спасибо за ответ. Это хороший намек на использование FadeDrawable. Теперь он отлично работает. –