2016-01-26 31 views
0

我在我的自定義視圖中使用DraweeHolder來顯示圖像。當我想用新資源更新圖像時,我創建了一個新的DraweeController,然後將setController設置爲DraweeHolder。DraweeHolder中的壁畫交叉淡化

我想實現的是之前和新的圖像之間的交叉淡入淡出效果。 對於淡入/淡出,我遞歸地將setAlpha設置爲drawable。

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中同時出現兩個圖像(交叉淡入淡出)。即使爲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

順便說一句,付款人已經提供FadeDrawable,這樣就不需要惹測量時間和計算你自己的阿爾法。 – plamenko

+0

此外,爲了等待交叉淡入,直到新圖像實際加載完畢,您可以設置控制器偵聽器,並在'onFinalImageSet'中執行'mFadeDrawable.fadeToLayer(mCurrentIndex)'。 – plamenko

+0

感謝您的回覆。這是一個很好的暗示使用FadeDrawable。它現在很好用。 –