TransitionDrawable:完成后自动反向转换

时间:2011-12-30 16:43:01

标签: android android-ui

我想高效地添加新添加的ListView项目。我认为这很简单,但我很容易解决问题:

我想播放TransitionDrawable动画,一旦完成 - 回放它。新项目将在一段时间内升级,然后它将与其他项目融合。

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

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

但是TransitionDrawable类支持这一点。

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

或许我应该使用与TransitionDrawable不同的东西?我想避免使用Property Animations,因为我想支持更旧的设备(从Honeycomb开始就可以使用PA)。

5 个答案:

答案 0 :(得分:5)

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

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

我现在的时间有点短,所以请你给我一个评论以防你需要更具体的指针(例如代码片段) - 然后我会试着找一些时间来帮助你。 / p>

答案 1 :(得分:0)

也许你可以试试这个:

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();希望这有助于你。

答案 2 :(得分:0)

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

我还计划添加两个以上的drawables支持。

https://github.com/mehmet6parmak/CustomDrawables

答案 3 :(得分:0)

尝试使用处理程序;)

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

答案 4 :(得分:-2)

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

附加到ViewAnimator的输入和输出动画对象具有一个AnimationListener,用于触发您要捕获的事件