所以我正在使用动画来对一个视图进行动画效果:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="1000"
android:fromYDelta="0%"
android:toYDelta="-75%" />
</set>
它在视觉上做到了我想要的效果,但我也想冻结此动画的结果。就像我需要以某种方式获取动画后的布局参数(或其他内容?),并将其设置为布局。假设布局Y坐标从0变化到100,但我不知道起始坐标和终点坐标是什么。我需要获取最终坐标并将其设置为布局,因为如果不这样做,则布局在动画后会返回到初始位置,但我需要将其保持在新的位置而不是返回。另外,我需要一个兼容2.3.x的解决方案。
更新1
我也尝试过使用NineOldAndroids:
ObjectAnimator.ofFloat(rootWrapper, "translationY", -rootWrapper.getHeight()*75/100).start();
这将使视图动画,并且视图将保持在动画位置 - 这正是我想要实现的。但是所有控件都保持在它们的位置上,即使布局只能看到其底部25%的部分,剩下的屏幕看起来很空。如果我点击空白屏幕区域,那么按钮(之前存在)的onClick将被触发。如果设置xml-animtaions,则情况也是如此
animation.setFillAfter(true);
如何解决此问题?所有控件都必须随视图移动。更新2
代码:
public void showAbout(){
final Animation animShow = AnimationUtils.loadAnimation(this, R.anim.about_in_from_bottom);
animShow.setFillAfter(true);
//ObjectAnimator.ofFloat(rootWrapper, "translationY", -rootWrapper.getHeight()*75/100).start();
animShow.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
LinearLayout.LayoutParams rootlp = (LinearLayout.LayoutParams) rootWrapper.getLayoutParams();
Log.i(this,"rootlp: h: "+rootlp.topMargin+ " / w: "+rootlp.bottomMargin);
rootlp.topMargin = -rootlp.height*75/100;
rootWrapper.setLayoutParams(rootlp);
}
});
rootWrapper.startAnimation(animShow);
}
我明白问题所在了 - rootlp.height
返回0,因为它像是MATCH_PARENT或类似的东西。它不会返回实际像素,而是代表某个常量的值!所以看起来我需要使用 .getViewTreeObserver().addOnGlobalLayoutListener
来解决这个问题。
好的,通过 getViewTreeObserver() 我获取了 rootWrapper 的真实高度。现在使用公式 rootlp.topMargin = -rootlp.height*75/100;
,我遇到了更多的问题。
1)动画后视图会额外移动(由于设置了 LP)。
2)包含动画视图的控件(随父视图一起向上移动的按钮)虚拟地停留在原位(它们是不可见但可点击的)!在视觉上,这些控件随着动画视图向上移动,我无法到达它们(它们离开了屏幕)。但是如果我点击它们动画前所在的区域,相应的 onClick() 会被触发!多么有趣啊!
更新3
最终我实现了我的目标!问题出在移动视图的子容器上。我认为如果移动某个视图,则其所有子视图也会一起移动。但事实并非如此,我不得不在动画完成后手动移动子视图,以修复幽灵按钮。