programing

보기에 Android 스케일 애니메이션

goodcopy 2021. 1. 16. 10:37
반응형

보기에 Android 스케일 애니메이션


ScaleAnimation (xml이 아닌 프로그래밍 방식)을 사용하여 높이를 부모 높이의 0에서 60 %로 변경하고 싶습니다. 보기 너비는 일정하며 50px입니다. 보기가 비어 있습니다. 배경색 만 설정됩니다.

누군가 코드에서 scaleAnimScaleAnimation 사용하는 코드를 줄 수 있습니까 ?

<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(...);

애니메이션 전후보기

애니메이션 전후보기. 감사합니다.


다음은이를 정확히 수행하는 코드입니다.

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 생성자는 우리가 신경 쓰지 않는 X-scale 처리와 관련된 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);

이 코드를 사용하여 xml을 사용하지 않고 Scale 애니메이션을 만듭니다.

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

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이 그 방향으로 확장되지 않고 전체 너비로 유지되는 반면 0.0 -> 1.0질문의 그래픽에서 볼 수 있듯이 Y 축 에서는 배율 조정됩니다. 이것이 누군가를 돕기를 바랍니다.

일부는 요청 된대로 Java 코드를 알고 싶어 할 수 있습니다.

애니메이션 파일을 anim폴더에 넣고 다음과 같은 애니메이션 파일을로드하고 설정합니다.

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

이 방법 사용

당신이 원하는 경우 규모 분기에을 (반 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)함수를 사용하십시오 .

알파회전같은 다른 속성을 사용할 수 있습니다.

전체 코드

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
           }
      });

다음 과 같은 도우미 메서드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();
        }
      }  
    }
  });
}

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);
    }

참조 URL : https://stackoverflow.com/questions/7414065/android-scale-animation-on-view

반응형