我试图将两个动画"链接"在一起,所以当一个完成时,另一个开始.这是有效的,除了一个问题.第一个动画完成后,它会移回原来的位置.我设置填充后为真.我还缺少什么?
这是我正在使用的代码.请注意,这是在扩展LinearLayout的类中.
// FIRST ANIMATION
mAnimation = new TranslateAnimation(0, PANEL_END_X, 0, 0);
mAnimation.setDuration(PANEL_TRANSITION_TIME);
mAnimation.setFillAfter(true);
mAnimation.setAnimationListener(new Animation.AnimationListener() {
public void onAnimationEnd(Animation animation) {
// FIRST ANIMATION COMPLETE, CALL THE SECOND ANIMATION
startAnimation(mAlphaAnimation);
}
});
// SECOND ANIMATION
mAlphaAnimation = new AlphaAnimation(1.0f, 0.0f);
mAlphaAnimation.setDuration(PANEL_ALPHA_TRANSITION_TIME);
mAlphaAnimation.setFillAfter(true);
Run Code Online (Sandbox Code Playgroud)
解:
我能让这个让我满意的唯一方法是使用一个AnimationSet,但设置第二个动画的起始偏移量来开始第一个动画的偏移+持续时间,加上一点填充.在我的情况下,它们不一定非常精确.
我尝试使用CommonsWare建议的各种值,但我总是得到某种类型的"捕捉"效果,其中值在恢复之前会恢复到原始值.
我使用AnimationSet.Builder类找到了我认为是API级别11及以上的理想解决方案.
Builder对象是一个实用程序类,便于将动画添加到AnimatorSet以及各种动画之间的关系.Builder方法的意图以及AnimatorSet的play()方法的目的是使以自然方式表达动画的依赖关系成为可能.开发人员也可以使用playTogether()和playSequentially()方法,如果这些方法符合需要,但在某些情况下可能更容易表达成对的动画Animator集
例如,这会设置一个AnimatorSet来同时播放anim1和anim2,anim3在anim2完成时播放,anim4播放anim3完成时播放:
AnimatorSet s = new AnimatorSet();
s.play(anim1).with(anim2);
s.play(anim2).before(anim3);
s.play(anim4).after(anim3);
Run Code Online (Sandbox Code Playgroud)
第一个动画完成后,它会移回原来的位置.我设置填充后为真.我还缺少什么?
动画是瞬态效应.如果你想让效果永久化,你必须自己做onAnimationEnd().在a的情况下TranslateAnimation,您需要更改LayoutParams受影响的窗口小部件或其他内容以永久保持其最终位置.或者,如果要将其从屏幕上翻译出来,请将可见性设置为View.GONE.
| 归档时间: |
|
| 查看次数: |
9356 次 |
| 最近记录: |