【问题标题】:TransitionDrawable: automatically reverse transition once it completesTransitionDrawable:完成后自动反转过渡
【发布时间】:2016-07-08 21:51:15
【问题描述】:

我想突出显示新添加的 ListView 项目,效果很好。我认为这很简单,但我偶然发现了一个问题:

我想播放 TransitionDrawable 动画,一旦它完成 - 倒带它。新项目将被高亮显示一会儿,然后它会与其他项目融合在一起。

TransitionDrawable 具有向前和向后播放动画的方法,但没有可用于同步的方法。我希望有可能为动画完成指定回调,例如:

 TransitionDrawable transition = (TransitionDrawable) view.getBackground();
 transition.startTransition(500, new TransitionCompleteListener(){
               public void completed()
               { 
                    transition.reverseTransition(500);
               }
       });

但 TransitionDrawable 类不支持这样的功能。

问题是:如何播放 TransitionDrawable 动画,当它结束时 - 立即向后播放?我有一个想法,使用Timer 类来延迟动画向后部分的执行,但是对于这么简单的事情,这个解决方案看起来有点太重了。

或者我应该使用与 TransitionDrawable 不同的东西?我想避免使用属性动画,因为我想支持旧设备(自 Honeycomb 以来 PA 可用)。

【问题讨论】:

    标签: android android-ui


    【解决方案1】:

    我自己还没有真正尝试过,但我想说你的目标也可以通过老式的 View 动画实现,准确地说是tween。您可以通过更改与行布局具有完全相同尺寸的 View 的 alpha 属性,而不是直接操作背景可绘制对象(假设这是您当前正在执行的操作),从而可能创建相同的效果。然后,您可以在单个 AnimationSet 中指定“正常”动画及其反向动画,并让后者以基于第一个的延迟开始。或者,Animation 提供了一个AnimationListener,您可以连接到第一个动画结束时收到通知,然后开始它的反转。

    查看TransitionDrawable 的源代码,我还看到了使用自定义侦听器接口扩展当前实现的一些可能性。实际实现您在问题中的代码 sn-p 中说明的模式应该不会太难。

    我现在的时间有点短,所以如果您需要任何更具体的指示(例如代码 sn-ps),请给我发表评论 - 然后我会在这个周末找一些时间来帮助您.

    【讨论】:

    • 嗯...如果我将整个 ListView 的背景颜色设置为用于突出显示项目的颜色,并将所有行的颜色设置为白色,则使用补间可以工作。然后,通过操纵特定行的 alpha 值,我将实现高亮效果。但是继承 TransitionDrawable 的想法似乎更好,更干净,更“正确”。我现在查看了它的源代码,似乎很容易实现我需要的东西。我会在编写代码时用解决方案更新我的问题,现在我需要回到我的硕士论文(与这个 ofc 无关 - 这是一个爱好项目)。你赢得了赏金。
    【解决方案2】:

    也许你可以试试这个:

    Drawable[] transBack =  new Drawable[] { res.getDrawable( R.drawable.ic_acept_blue ), res.getDrawable( R.drawable.ic_acept )};
    
    ImageView btn = (ImageView) findViewById(R.id.resource);
    TransitionDrawable transitionAcept = new TransitionDrawable(transBack);
    btn.setImageDrawable(transitionAcept);
    
    btn.setOnTouchListener(new View.OnTouchListener() {
       @Override
       public boolean onTouch(View v, MotionEvent event) {
          // TODO Auto-generated method stub
          switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:{
               TransitionDrawable transition = (TransitionDrawable) btn.getDrawable();
               transition.startTransition(75);
          }break;
          case MotionEvent.ACTION_UP:{
               TransitionDrawable transition = (TransitionDrawable) btnAcept.getDrawable();
               transition.reverseTransition(75);
               v.performClick();
          }break;
          default:
           break;
       }
       return true;
    }
    });
    btn.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
          //... DO Something here
       }
    });
    

    上面的代码实现了一个 TouchListener 来处理反向和正向转换,以及一个 clickListener 来处理你的动作。这就是为什么在MotionEvent.ACTION_UP 中您调用v.performClick(); 希望这对您有所帮助。

    【讨论】:

      【解决方案3】:

      我已经扩展了TransitionDrawable 的实现(实际上是复制并修改了它),以接受一个repeatCount 参数,该参数说明来回转换的次数。请参阅下面存储库中的RepeatableTransitionDrawable

      我还计划添加两个以上的可绘制对象支持。

      https://github.com/mehmet6parmak/CustomDrawables

      【讨论】:

        【解决方案4】:

        尝试使用处理程序;)

        final TransitionDrawable transition = (TransitionDrawable) sizesSelectionLayout.getBackground();
        int duration = 500;
        transition.startTransition(duration);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                transition.reverseTransition(duration);
            }
        }, duration);
        

        ;)

        【讨论】:

          【解决方案5】:

          使用 ViewAnimator 进行评估 http://developer.android.com/reference/android/widget/ViewAnimator.html

          附加到 ViewAnimator 的进出动画对象有一个 AnimationListener,它会触发您要捕获的事件

          【讨论】:

          • 我可能错了——但 ViewAnimator 不是用来在视图之间切换的吗(就像在 ViewFlipper 中一样,它是它的子类)?
          • 是的,我的建议是有两种观点;一个正常,一个突出显示。基本上,对于您的列表行 xml,您将 ViewAnimator 作为外部元素,其子元素与您当前的列表行相同。然后,当添加一个您想要获得焦点的元素时,您可以通过代码向 ViewAnimator 添加一个新视图,并开始转换到表示您突出显示状态的视图。您设置一个事件侦听器并在事件完成时捕获该事件,然后反转操作。
          猜你喜欢
          • 1970-01-01
          • 2021-09-03
          • 1970-01-01
          • 2019-01-24
          • 2013-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多