web-dev-qa-db-ja.com

Androidビューでアニメーションをスケール

ScaleAnimation(プログラムではxmlにない)を使用して、表示する高さを親の高さの0〜60%に変更します。ビューの幅は一定で、50pxです。ビューは空で、背景色のみが設定されています。

誰かがコードからScaleAnimationを使用してscaleAnimのコードをくれますか。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:id="@+id/layContainer
    >
<View  
    Android:layout_width="50px" 
    Android:layout_height="fill_parent" 
    Android:id="@+id/viewContainer" 
    Android:background:"#00f00"
    />

</LinearLayout>


ScaleAnimation scaleAnim = new ScaleAnimation(...);

view before and after animation

アニメーションの前後を見る。ありがとう

53
Jovan

これを正確に行うためのコードの一部を次に示します。

public void scaleView(View v, float startScale, float endScale) {
    Animation anim = new ScaleAnimation(
            1f, 1f, // Start and end values for the X axis scaling
            startScale, endScale, // Start and end values for the Y axis scaling
            Animation.RELATIVE_TO_SELF, 0f, // Pivot point of X scaling
            Animation.RELATIVE_TO_SELF, 1f); // Pivot point of Y scaling
    anim.setFillAfter(true); // Needed to keep the result of the animation
    anim.setDuration(1000);
    v.startAnimation(anim);
}

ここで使用するScaleAnimationコンストラクターは8つの引数を取ります。4つの引数は、(1f, 1f, ... Animation.RELATIVE_TO_SELF, 0f, ...)を気にしないXスケールの処理に関連しています。

他の4つの引数は、気にするYスケーリング用です。

startScale, endScale-あなたの場合、0f, 0.6fを使用します。

Animation.RELATIVE_TO_SELF, 1f-これは、ビューの縮小が折りたたまれる場所を指定します(ドキュメントではピボットと呼ばれます)。ここでは、アニメーションの下部からバーの成長を開始するため、float値を1fに設定します。上から下に向かって成長させたい場合は、0fを使用します。

最後に、同様に重要なのは、anim.setFillAfter(true)の呼び出しです。アニメーションの完了後にアニメーションの結果を保持したい場合は、アニメーションを実行する前にアニメーターでこれを実行する必要があります。

あなたの場合、次のようなことができます:

View v = findViewById(R.id.viewContainer);
scaleView(v, 0f, .6f);
108
Jazzer

このコードを試して、xmlを使用せずにScaleアニメーションを作成してください

ScaleAnimation animation = new ScaleAnimation(fromXscale, toXscale, fromYscale, toYscale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
47
ilango j

XMLでは、これは同じ結果を得るために使用します。これはより直感的かもしれません。

scale_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

<scale
    Android:duration="200"
    Android:fromXScale="1.0"
    Android:fromYScale="0.0"
    Android:pivotX="50%"
    Android:pivotY="100%"
    Android:toXScale="1.0"
    Android:toYScale="1.0" />

</set>

scale_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

<scale
    Android:duration="200"
    Android:fromXScale="1.0"
    Android:fromYScale="1.0"
    Android:pivotX="50%"
    Android:pivotY="100%"
    Android:toXScale="1.0"
    Android:toYScale="0.0" />

</set>

X軸のアニメーションは1.0 -> 1.0からのものです。これは、その方向にスケールアップせず、全幅のままであり、Y軸では、質問の図に示すように0.0 -> 1.0スケーリングを取得することを意味します。これが誰かを助けることを願っています。

要求に応じてJavaコードを知りたい場合があります

アニメーションファイルをanimフォルダーに配置してから、アニメーションファイルをロードして設定します。

Animation scaleDown = AnimationUtils.loadAnimation(youContext, R.anim.scale_down);
ImagView v = findViewById(R.id.your_image_view);
v.startAnimation(scaleDown);
44
Subin Sebastian

この方法を使用してください

必要な場合scale to quarter(half x、half y)

view.animate().scaleX(0.5f).scaleY(0.5f)

scaleが必要で、右下に移動する場合

view.animate().scaleX(0.5f).scaleY(0.5f)
        .translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())

topに移動する場合は(-view.height/4)を使用し、left(-view.width/4)には

何かしたい場合アニメーションの終了後withEndAction(Runnable runnable)関数を使用します。

alpharotationのような他のプロパティを使用できます

完全なコード

view.animate()
      .scaleX(0.5f).scaleY(0.5f)//scale to quarter(half x,half y)
      .translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())// move to bottom / right
      .alpha(0.5f) // make it less visible
      .rotation(360f) // one round turns
      .setDuration(1000) // all take 1 seconds
      .withEndAction(new Runnable() {
           @Override
           public void run() {
              //animation ended
           }
      });
6
Radesh

ヘルパーメソッドおよびstart-repeat-endハンドラーを使用して、次のようにサイズを変更します。

resize(
    view1,
    1.0f,
    0.0f,
    1.0f,
    0.0f,
    0.0f,
    0.0f,
    150,
    null,
    null,
    null);

  return null;
}

ヘルパーメソッド:

/**
 * Resize a view.
 */
public static void resize(
  View view,
  float fromX,
  float toX,
  float fromY,
  float toY,
  float pivotX,
  float pivotY,
  int duration) {

  resize(
    view,
    fromX,
    toX,
    fromY,
    toY,
    pivotX,
    pivotY,
    duration,
    null,
    null,
    null);
}

/**
 * Resize a view with handlers.
 *
 * @param view     A view to resize.
 * @param fromX    X scale at start.
 * @param toX      X scale at end.
 * @param fromY    Y scale at start.
 * @param toY      Y scale at end.
 * @param pivotX   Rotate angle at start.
 * @param pivotY   Rotate angle at end.
 * @param duration Animation duration.
 * @param start    Actions on animation start. Otherwise NULL.
 * @param repeat   Actions on animation repeat. Otherwise NULL.
 * @param end      Actions on animation end. Otherwise NULL.
 */
public static void resize(
  View view,
  float fromX,
  float toX,
  float fromY,
  float toY,
  float pivotX,
  float pivotY,
  int duration,
  Callable start,
  Callable repeat,
  Callable end) {

  Animation animation;

  animation =
    new ScaleAnimation(
      fromX,
      toX,
      fromY,
      toY,
      Animation.RELATIVE_TO_SELF,
      pivotX,
      Animation.RELATIVE_TO_SELF,
      pivotY);

  animation.setDuration(
    duration);

  animation.setInterpolator(
    new AccelerateDecelerateInterpolator());

  animation.setFillAfter(true);

  view.startAnimation(
    animation);

  animation.setAnimationListener(new AnimationListener() {

    @Override
    public void onAnimationStart(Animation animation) {

      if (start != null) {
        try {

          start.call();

        } catch (Exception e) {
          e.printStackTrace();
        }
      }

    }

    @Override
    public void onAnimationEnd(Animation animation) {

      if (end != null) {
        try {

          end.call();

        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }

    @Override
    public void onAnimationRepeat(
      Animation animation) {

      if (repeat != null) {
        try {

          repeat.call();

        } catch (Exception e) {
          e.printStackTrace();
        }
      }  
    }
  });
}
1
Zon
public void expand(final View v) {
        ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 1, 0, 0, 0);
        scaleAnimation.setDuration(250);
        scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                v.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        v.startAnimation(scaleAnimation);
    }

    public void collapse(final View v) {
        ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 0, 1, 0, 0);
        scaleAnimation.setDuration(250);
        scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                v.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        v.startAnimation(scaleAnimation);
    }
0
Tomash VK