Android масштабная анимация в поле зрения - PullRequest
53 голосов
/ 14 сентября 2011

Я хочу использовать ScaleAnimation (программно не в xml), чтобы изменить высоту просмотра от 0 до 60% от родительской высоты. Ширина обзора постоянна и составляет 50 пикселей. Вид пуст, задан только цвет фона.

Может кто-нибудь дать мне код для scaleAnim, используя ScaleAnimation из кода.

<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

просмотр до и после анимации .THANKS

Ответы [ 6 ]

107 голосов
/ 06 декабря 2013

Вот фрагмент кода, чтобы сделать именно это.

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, ...).

Остальные 4 аргумента относятся к Y-шкале, о которой мы заботимся.

startScale, endScale - В вашем случае вы бы использовали 0f, 0.6f.

Animation.RELATIVE_TO_SELF, 1f - Здесь указывается, где происходит сжатие представления (в документации это называется стержнем). Здесь мы устанавливаем значение с плавающей точкой 1f, потому что мы хотим, чтобы анимация начинала увеличивать полосу снизу. Если бы мы хотели, чтобы он рос сверху вниз, мы бы использовали 0f.

Наконец, не менее важным является призыв к anim.setFillAfter(true). Если вы хотите, чтобы результат анимации оставался после завершения анимации, вы должны запустить его на аниматоре перед выполнением анимации.

Так что в вашем случае вы можете сделать что-то вроде этого:

View v = findViewById(R.id.viewContainer);
scaleView(v, 0f, .6f);
47 голосов
/ 14 сентября 2011

попробуйте этот код для создания анимации Scale без использования xml

ScaleAnimation animation = new ScaleAnimation(fromXscale, toXscale, fromYscale, toYscale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
44 голосов
/ 10 января 2013

В 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);
5 голосов
/ 03 марта 2019

Используйте этот метод

Если вы хотите масштаб до четверти (половина x, половина y)

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

Если вы хотите масштаб и переместитесь в нижний правый

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

Если вы хотите перейти в верхний , используйте (-view.height/4) и для влево (-view.width / 4)

Если вы хотите сделать что-то после окончания анимации , используйте withEndAction(Runnable runnable) функцию.

Вы можете использовать другое свойство, например alpha и вращение

Полный код

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
           }
      });
1 голос
/ 30 июля 2018
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);
    }
1 голос
/ 10 июля 2018

Изменение размера с использованием вспомогательных методов и обработчики 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();
        }
      }  
    }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...