web-dev-qa-db-ja.com

Androidでレイアウトを画面の上部から300dpに、またはその逆にアニメーション化するにはどうすればよいですか?

要件

toYDelta="100%またはtoYDelta="50%などに基づいてレイアウトを翻訳できます。

しかし、私は300dp Heightでのみレイアウトをアニメーション化したいです。

slide_down.xml

<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="500"
    Android:fromYDelta="0"
    Android:toYDelta="100%" />

slide_up.xml

<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="500"
    Android:fromYDelta="100%"
    Android:toYDelta="0" />

Javaコード(アニメーション)

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 

    }
});

モックアップ

Animation Mockup

問題

300dpの高さに基づいて行う方法は?

この問題について私を助けてください。

ありがとうございました。

14
Darshak

アニメーションを見る

驚いたことに、XMLで300dpの変換アニメーションを指定する方法はないようです。アニメーションの変換 XML構文 は、3つの異なる距離指定を受け入れます。

  • 通常の位置を基準にした絶対ピクセル(例:Android:toYDelta="10"
  • 要素の幅/高さに対するパーセンテージ(例:Android:toYDelta="10%"
  • 親の幅/高さに対するパーセンテージ(例:Android:toYDelta="10%p"

TranslateAnimationJava経由 を作成する場合も、同じ仕様に制限されます。ただし、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();
41
antonyt