0

我有一个包含艺术家列表的 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,您也可以看到初始负载从空心到填充心闪烁。每当列表无效时也会发生这种情况,例如如果它被过滤到更小的艺术家集合中。

我想因为它需要做一些事情并且实际上不仅仅是设置可绘制对象,所以 0 实际上并不是“即时”的。我找不到任何其他方式从“结束”位置开始,除了在过渡可绘制本身中反转图像的起始位置。

但是,如果我这样做,开始/反向将在心脏的基础上表现不同。充其量,我需要扩展可绘制的过渡,并覆盖启动/反向/重置方法以考虑它所处的初始状态,这似乎有点骇人听闻?

我是否遗漏了一些明显的东西,从结束位置开始但不会导致闪烁?

谢谢!

4

2 回答 2

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 中执行此操作,这将起作用

于 2017-05-20T07:04:35.367 回答
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);
    }
}
}

`

于 2017-05-14T20:15:00.550 回答