Android - TransitionDrawable从' end'开始最初绘制时状态闪烁

时间:2017-05-14 19:25:17

标签: android android-animation transitiondrawable

我有一个包含艺术家名单的RecyclerView。艺术家可以被标记为喜欢或不喜欢。

有一个代表这个状态的心脏,我有一个可过渡的过渡,我从一个被勾勒出的心脏,到一个充满内心的心脏,如果有问题的艺术家被标记为喜爱。

,当用户点击心脏时,动画本身正常工作并在两者之间平滑过渡。

        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实际上并不是" instant"。我无法在" end"中找到任何其他方式。但是,除了在转换可绘制本身中反转图像的起始位置之外。

如果我这样做,开始/反转的行为将会逐一表现出来。充其量,我需要扩展转换drawable,并覆盖启动/反向/重置方法,以考虑它所处的初始状态,这看起来有点像hacky?

我是否错过了一些明显可以从最终位置开始但却没有引起闪烁的东西?

谢谢!

2 个答案:

答案 0 :(得分:1)

你没有移除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

中执行此操作,这将有效

答案 1 :(得分: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);
    }
}
}

`