だから私はアニメーションを使ってビューをアニメーション化しています:
<?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 に変化すると仮定しますが、何が開始座標で、何が結果座標であるかはよくわかりません。結果の座標を取得し、それをレイアウト cuz に設定する必要があります。 そうしないと、アニメーション後にレイアウトが元の位置に戻りますが、元に戻るのではなく、新しい位置にとどまるようにする必要があります。また、2.3.x 互換のソリューションが必要です。
更新 1
私も NineOldAndroids を試しました:
ObjectAnimator.ofFloat(rootWrapper, "translationY", -rootWrapper.getHeight()*75/100).start();
これはビューをアニメーション化し、ビューはアニメーション化された位置にとどまります-それはまさに私が達成したいことです。
ただし、すべてのコントロールは事実上その位置にとどまります。その空の画面領域をタップすると、レイアウトが下部の 25% しか表示されず、残りの画面の 75% が空に見えます。設定されている場合、xml-animtaions でも同じことが起こります
animation.setFillAfter(true);
その問題を解決するにはどうすればよいですか?すべてのコントロールは、ビューと共に移動する必要があります。
UPDATE 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
-MATCH_PARENTなどのように0 cuzを返します。REAL ピクセルは返されませんが、定数を表す値が返されます。だから、私は で 2 プレイしているよう.getViewTreeObserver().addOnGlobalLayoutListener
です。
わかりました、getViewTreeObserver() を介して rootWrapper の実際の高さを取得しました。そして今、式rootlp.topMargin = -rootlp.height*75/100;
を使用すると、さらに多くの問題が発生します。
1) アニメーション後、ビューがさらに上に移動します (LP の設定による)。
2) アニメーション ビューに含まれるコントロール (親ビューと共に上に移動する必要があるボタン) は、仮想的にその位置にとどまります (非表示ですがクリック可能です)。これらのコントロールは、アニメーション化されたビューで視覚的に上に移動し、到達できません (画面から消えます)。しかし、アニメーションに対応する onClick() トリガーの前にあった領域をタップすると! なんて楽しい!
更新 3
ついに目標を達成しました!問題は、ビューの子コンテナーの移動にありました。ビューを移動すると、そのすべての子ビューも移動すると考えていました。しかし、そうではなく、アニメーションが完了した後、子ビューを手動で移動してゴースト ボタンを修正する必要がありました。