2011-12-30 33 views
8

我想高效地添加新添加的ListView项目。我认为这很简单,但我st upon了一个问题:TransitionDrawable:一旦完成就自动反向转换

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

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

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

但没有像由TransitionDrawable类支持。

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

或者我应该使用不同的TransitionDrawable?我想避免使用属性动画,因为我想支持较老的设备(并且自从Honeycomb开始PA可用)。

回答

4

我还没有真正尝试过自己尚未事件的AnimationListener,但我会说你想瞄准的东西也许可以用一个老式的View动画,一个确切的tween。而不是直接操作背景drawable(假设这就是你现在正在做的事情),你可以通过改变View的alpha属性来创建相同的效果,该属性的尺寸与行布局的尺寸完全相同。然后,您可以在一个AnimationSet中同时指定“正常”动画及其相反方向,并使后者以基于第一个的延迟开始。或者,动画提供了一个AnimationListener,您可以在第一个动画结束时连接并获得通知,并随后开始反向。

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

我现在的时间有点短,所以如果你需要更多具体的指针(例如代码片段),请给我一个评论 - 然后我会尝试在本周末找点时间来帮助你。

+0

嗯......使用补间可以工作,如果我将整个ListView的背景颜色设置为用于高亮项目的颜色,并将所有行的颜色设置为白色。然后,通过操纵特定行的阿尔法值,我会达到最高效果。但是继承TransitionDrawable的想法似乎更好,更干净,更“正确”。我现在看了看它的源代码,看起来很容易实现我需要的东西。当我编写代码时,我会用解决方案更新我的问题,现在我需要回到我的硕士论文(不涉及这个ofc - 这是一个业余爱好项目)。你赢得了赏金。 – user1234567 2012-01-08 12:52:14

-2

评估使用ViewAnimator代替 http://developer.android.com/reference/android/widget/ViewAnimator.html

的进出动画对象连接到ViewAnimator有触发你想捕捉

+0

我可能是错 - 但不ViewAnimator使用(在ViewFlipper视图之间切换一样,这是它的子类)? – user1234567 2012-01-08 12:40:36

+0

是的,我的建议是有两个意见;一个正常,一个突出显示。基本上,对于列表行xml,您将ViewAnimator作为外部元素,其子元素与您当前的列表行相同。然后,当您想添加焦点的元素时,您可以通过代码将新视图添加到ViewAnimator,并开始转换到表示突出显示状态的视图。您设置了一个事件监听器,并在事件完成时捕获该事件,并且您撤消该操作。 – dparnas 2012-01-08 20:40:57

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

0

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

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

https://github.com/mehmet6parmak/CustomDrawables

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