【问题标题】:Android - TransitionDrawable starting in 'end' state flickers when initially drawnAndroid - 初始绘制时以“结束”状态开始的 TransitionDrawable 闪烁
【发布时间】:2017-05-14 19:25:16
【问题描述】:

我有一个包含艺术家列表的 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 实际上并不是“即时”的。我找不到任何其他方式从“结束”位置开始,除了在过渡绘图本身中反转图像的起始位置。

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

我是否遗漏了一些在结束位置开始但不会导致闪烁的明显内容?

谢谢!

【问题讨论】:

    标签: android android-animation transitiondrawable


    【解决方案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 中执行此操作,这将起作用

    【讨论】:

    • 这就是我最终做的事情,但它需要我的回答才能完全发挥作用,因为如果您考虑关闭边框并完成收藏夹,则开始/反向会翻转。
    【解决方案2】:

    除非有更好的方法来做到这一点,否则我会继续扩展它,并根据初始状态翻转启动/反向调用。

    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);
        }
    }
    }
    

    `

    【讨论】:

      猜你喜欢
      • 2018-05-23
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2022-11-26
      • 2019-05-08
      • 2012-04-16
      • 1970-01-01
      相关资源
      最近更新 更多