2017-05-14 58 views
0

我有一個RecyclerView,其中包含一個藝術家列表。藝術家可以被標記爲最喜歡的或不是最喜歡的。Android - TransitionDrawable在開始繪製時以'結束'狀態閃爍開始

有一顆心代表這種狀態,並且我有一個可以繪製的過渡,我從一個輪廓的心臟到一個充滿的心臟,如果相關藝術家被標記爲最愛。當用戶點擊心臟時,動畫本身工作正常,並且在兩者之間平滑過渡,並且看起來很漂亮。

 TransitionDrawable td = new TransitionDrawable(new Drawable[]{ 
       ContextCompat.getDrawable(getActivity(), R.drawable.favorite_border), 
       ContextCompat.getDrawable(getActivity(), R.drawable.favorite)}); 

     artistViewHolder.image.setImageDrawable(td); 

     if (artist.isFavorite()) { 
      td.startTransition(0); 
     } 

在onclick用於該項目時,我打電話或者.reverseTransition(300)或.startTransition(300),這取決於下一個狀態。

我在任何時候創建視圖(第一屏幕加載)時遇到問題,我需要從第二個位置開始(最喜歡)。儘管我的動畫時間在創建時設置爲0,但您可以看到它的初始加載從空心到閃爍的心臟閃爍。這種情況也會在列表失效時發生,例如,如果它被過濾爲一小部分藝術家。

我猜想,因爲它需要做的事情,並不是實際上只是設置drawable,0實際上並不是「即時」。但是我找不到任何其他方式在「結束」位置開始,除了在可轉換繪製本身中顛倒圖像的起始位置。

如果我這樣做,啓動/反向將以不同的心態爲基礎。充其量,我需要擴展可繪製的轉換,並覆蓋啓動/反轉/重置方法,以考慮它處於哪個初始狀態,並且這看起來有點怪異?

我是否錯過了一些顯而易見的東西,但不會導致閃爍?

謝謝!

回答

0

除非有更好的方法來做到這一點,否則我已經提前並延長了它,並且基於初始狀態翻轉了開始/反向呼叫。

public class MyTransitionDrawable extends TransitionDrawable{ 

private boolean initialFavorite = false; 

public MyTransitionDrawable(Drawable[] layers) { 
    super(layers); 
} 

public MyTransitionDrawable(Drawable[] layers, boolean initialFavorite) { 
    super(layers); 
    this.initialFavorite = initialFavorite; 
} 

public boolean isInitialFavorite() { 
    return initialFavorite; 
} 

@Override 
public void startTransition(int durationMillis) { 
    if(!initialFavorite){ 
     super.startTransition(durationMillis); 
    }else{ 
     super.reverseTransition(durationMillis); 
    } 
} 

@Override 
public void reverseTransition(int durationMillis) { 
    if(!initialFavorite){ 
     super.reverseTransition(durationMillis); 
    }else{ 
     super.startTransition(durationMillis); 
    } 
} 
} 

`

1

你不migtht上td.startTransition刪除閃爍(0); 因此,您需要在Drawables數組中更改訂單。 例如

Drawable favorite_border = ContextCompat.getDrawable(getActivity(), R.drawable.favorite_border); 
Drawable favorite = ContextCompat.getDrawable(getActivity(), R.drawable.favorite); 
TransitionDrawable td = new TransitionDrawable(isFavorite 
       ? new Drawable[]{favorite, favorite_border} 
       : new Drawable[]{favorite_border, favorite}); 

artistViewHolder.image.setImageDrawable(td); 

這將工作只要您在onBindViewHolder

+0

這就是我所做的最後做做到這一點,但它需要我的回答完全工作,因爲啓動/反轉成爲你考慮的邊界翻轉關閉和最喜歡的完成。 – Ben987654