toYDelta="100%
またはtoYDelta="50%
などに基づいてレイアウトを翻訳できます。
しかし、私は300dp Height
でのみレイアウトをアニメーション化したいです。
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="500"
Android:fromYDelta="0"
Android:toYDelta="100%" />
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="500"
Android:fromYDelta="100%"
Android:toYDelta="0" />
Animation animation = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide_down);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
// I can hide layout after animation completion
}
});
300dpの高さに基づいて行う方法は?
この問題について私を助けてください。
ありがとうございました。
驚いたことに、XMLで300dpの変換アニメーションを指定する方法はないようです。アニメーションの変換 XML構文 は、3つの異なる距離指定を受け入れます。
Android:toYDelta="10"
)Android:toYDelta="10%"
)Android:toYDelta="10%p"
)TranslateAnimation
Java経由 を作成する場合も、同じ仕様に制限されます。ただし、Java)では、(特定のデバイスの)同等の絶対ピクセル値を計算し、それをピクセル変換距離として指定できます。
300dpを取得するには、XMLで300dpの dimen value を定義するか、単にコードで計算を実行します。
内部dimens.xml
:
<dimen name="distance">300dp</dimen>
アクティビティ/フラグメントなどの内部:
float distance = getResources().getDimensionPixelSize(R.dimen.distance);
[〜#〜]または[〜#〜]
アクティビティ/フラグメントなどの内部:
float distance = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 300,
getResources().getDisplayMetrics()
);
次に、TranslateAnimation
を作成するときにその距離を使用するだけです。
TranslateAnimation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, distance
);
Android 3.0以降をターゲットにしている場合は、新しい プロパティアニメーション フレームワークを使用して、同じアニメーションをよりエレガントに表現できます。
view.animate().translationY(distance).setDuration(...).start();
まだAndroid 2.xをターゲットにしている場合は、 NineOldAndroids を使用して、下位互換性のあるアニメーション構文を取得できます。これをサポートするデバイスの新しいプロパティアニメーションが自動的に使用されます。 。
ViewPropertyAnimator.animate(view).translationY(distance).setDuration(...).start();