所以我用動畫的動畫視圖:請查看動畫在最終動畫中的位置
<?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觸發(其中有b4動畫),剩餘75%的屏幕看起來是空的。如果設置了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的Cuz它像MATCH_PARENT或喜歡。它不會返回REAL像素,而是一些代表某些常量的值!所以看起來我有兩個玩.getViewTreeObserver().addOnGlobalLayoutListener
。
好吧,我通過getViewTreeObserver()獲得了rootWrapper的真正高度。現在使用公式rootlp.topMargin = -rootlp.height*75/100;
我收到了更多問題。
1)動畫View之後另外移動(由於設置LP)。
2)動畫視圖包含的控件(必須隨父視圖一起向上移動的按鈕)虛擬地停留在它們的位置(它們不可見但可點擊)!在視覺上,這些控件隨着動畫視圖向上移動,我無法觸及它(它離開屏幕)。但是,如果我點擊區域,他們之前動畫相應onClick()觸發!多麼有趣!
UPDATE 3
最後我達到了我的目標!問題在於移動View的子容器。我在想,如果我移動一些視圖,那麼它的所有子視圖也在移動。但事實並非如此,我必須在動畫完成後手動移動子視圖以修復幽靈按鈕。
你爲什麼試圖在動畫之後得到LayoutParams?你想讓視圖停留在動畫位置嗎? –
是的,正是我想要的2do。 – Stan
那麼看到我的anser並使用setFillAfter(); –