수색…


ImageView의 애니메이션 흔들기

res 폴더 아래에 "anim"이라는 새 폴더를 만들어 애니메이션 리소스를 저장하고이 폴더에 저장합니다.

shakeanimation.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="100"
    android:fromDegrees="-15"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:toDegrees="15" />

Landing이라는 빈 활동을 만듭니다.

activity_landing.xml

  <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/imgBell"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:src="@mipmap/ic_notifications_white_48dp"/>

    </RelativeLayout>

그리고 Landing.java에서 이미지 뷰를 애니메이트하는 방법

Context mContext;


 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mContext=this;
                setContentView(R.layout.activity_landing);

                AnimateBell();
        }

public void AnimateBell() {
        Animation shake = AnimationUtils.loadAnimation(mContext, R.anim.shakeanimation);
        ImageView imgBell= (ImageView) findViewById(R.id.imgBell);
        imgBell.setImageResource(R.mipmap.ic_notifications_active_white_48dp);
        imgBell.setAnimation(shake);
    }

페이드 인 / 아웃 애니메이션

뷰를 천천히 페이드 ObjectAnimator 하려면 ObjectAnimator 사용 ObjectAnimator . 아래 코드에서 볼 수 있듯이 .setDuration(millis) 사용하여 지속 시간을 설정합니다. 여기서 millis 매개 변수는 애니메이션의 지속 시간 (밀리 초)입니다. 아래 코드에서 뷰는 500 밀리 초 또는 1/2 초 동안 페이드 인 / 아웃합니다. ObjectAnimator 의 애니메이션을 시작하려면 .start() 호출 .start() . 애니메이션이 완료되면 onAnimationEnd(Animator animation) 가 호출됩니다. 보기의 가시성을 View.GONE 또는 View.VISIBLE 로 설정하는 좋은 장소입니다.

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;

void fadeOutAnimation(View viewToFadeOut) {
    ObjectAnimator fadeOut = ObjectAnimator.ofFloat(viewToFadeOut, "alpha", 1f, 0f);

    fadeOut.setDuration(500);
    fadeOut.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            // We wanna set the view to GONE, after it's fade out. so it actually disappear from the layout & don't take up space.
            viewToFadeOut.setVisibility(View.GONE);
        }
    });

    fadeOut.start();
}

void fadeInAnimation(View viewToFadeIn) {
    ObjectAnimator fadeIn = ObjectAnimator.ofFloat(viewToFadeIn, "alpha", 0f, 1f);
    fadeIn.setDuration(500);

    fadeIn.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationStar(Animator animation) {
            // We wanna set the view to VISIBLE, but with alpha 0. So it appear invisible in the layout.
            viewToFadeIn.setVisibility(View.VISIBLE);
            viewToFadeIn.setAlpha(0);
        }
    });

    fadeIn.start();
}

전환 드로잉 애니메이션

이 예제는 두 개의 이미지 만있는 이미지 뷰의 트랜잭션을 표시합니다 (각 트랜잭션 이후 첫 번째 및 두 번째 계층 위치에 대해 하나의 루프로 많은 이미지를 차례로 사용할 수 있음)

  • res/values/arrays.xml 이미지 배열 추가
<resources>

    <array
        name="splash_images">
        <item>@drawable/spash_imge_first</item>
        <item>@drawable/spash_img_second</item>
    </array>

</resources>

    private Drawable[] backgroundsDrawableArrayForTransition;
    private TransitionDrawable transitionDrawable;

private void backgroundAnimTransAction() {

        // set res image array
        Resources resources = getResources();
        TypedArray icons = resources.obtainTypedArray(R.array.splash_images);

        @SuppressWarnings("ResourceType")
        Drawable drawable = icons.getDrawable(0);    // ending image

        @SuppressWarnings("ResourceType")
        Drawable drawableTwo = icons.getDrawable(1);   // starting image


        backgroundsDrawableArrayForTransition = new Drawable[2];
        backgroundsDrawableArrayForTransition[0] = drawable;
        backgroundsDrawableArrayForTransition[1] = drawableTwo;
        transitionDrawable = new TransitionDrawable(backgroundsDrawableArrayForTransition);

        // your image view here - backgroundImageView
        backgroundImageView.setImageDrawable(transitionDrawable);
        transitionDrawable.startTransition(4000);

        transitionDrawable.setCrossFadeEnabled(false); // call public methods  

      
    }

ValueAnimator

ValueAnimator 는 값 (특정 유형, 예 : int , float 등)에 애니메이션을 적용하는 간단한 방법을 제공합니다.

그것을 사용하는 일반적인 방법은 다음과 같습니다.

  1. 값을 min 에서 max 움직이게하는 ValueAnimator 를 만듭니다.
  2. 계산 된 애니메이션 값을 사용할 UpdateListener 를 추가하십시오 ( getAnimatedValue() 얻을 수 getAnimatedValue() ).

ValueAnimator 만들 수있는 두 가지 방법이 있습니다.

(예시적인 코드는 애니메이션 float 에서 20f 까지 40f 에서 250ms )

  1. xml ( /res/animator/ 에 넣으십시오) :
<animator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="250"
    android:valueFrom="20"
    android:valueTo="40"
    android:valueType="floatType"/>
ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, 
        R.animator.example_animator);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator anim) {
        // ... use the anim.getAnimatedValue()
    }
});
// set all the other animation-related stuff you want (interpolator etc.)
animator.start();
  1. 코드에서 :
ValueAnimator animator = ValueAnimator.ofFloat(20f, 40f);
animator.setDuration(250);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator anim) {
        // use the anim.getAnimatedValue()
    }
});
// set all the other animation-related stuff you want (interpolator etc.)
animator.start();

ObjectAnimator

ObjectAnimator 의 서브 ValueAnimator (A)의 특성에 계산 된 값을 설정하는 기능이 추가로 target View .


그냥처럼 ValueAnimator , 당신이 만들 수있는 두 가지 방법이 있습니다 ObjectAnimator :

(예시적인 코드는 애니메이션 alpha (A)의 View 에서 0.4f 위해 0.2f 에서 250ms )

  1. xml ( /res/animator 에 넣으십시오)
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:duration="250"
                android:propertyName="alpha"
                android:valueFrom="0.4"
                android:valueTo="0.2"
                android:valueType="floatType"/>
ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(context,
        R.animator.example_animator);
animator.setTarget(exampleView);
// set all the animation-related stuff you want (interpolator etc.)
animator.start();
  1. 코드에서 :
ObjectAnimator animator = ObjectAnimator.ofFloat(exampleView, View.ALPHA, 0.4f, 0.2f);
animator.setDuration(250);
// set all the animation-related stuff you want (interpolator etc.)
animator.start();

ViewPropertyAnimator

ViewPropertyAnimatorView 속성을 애니메이션으로 만드는 단순화되고 최적화 된 방법입니다.

모든 단일 View 에는 animate() 메서드를 통해 사용할 수있는 ViewPropertyAnimator 객체가 있습니다. 이를 사용하여 간단한 호출로 한 번에 여러 속성에 애니메이션을 적용 할 수 있습니다. ViewPropertyAnimator 의 모든 단일 메소드는 ViewPropertyAnimator 가 애니메이트 ViewPropertyAnimator 특정 매개 변수의 목표 값을 지정합니다.

View exampleView = ...;
exampleView.animate()
        .alpha(0.6f)
        .translationY(200)
        .translationXBy(10)
        .scaleX(1.5f)
        .setDuration(250)
        .setInterpolator(new FastOutLinearInInterpolator());

참고 : ViewPropertyAnimator 객체에서 start() 를 호출하는 것은 필수 사항이 아닙니다 . 그렇게하지 않으면 플랫폼이 적절한 시간 (다음 애니메이션 처리 단계)에서 애니메이션 시작을 처리하도록하는 것입니다. 실제로 (call start() 호출하면) 즉시 애니메이션이 시작되는지 확인하고 있습니다.

보기의 애니메이션 펼치기 및 접기

public class ViewAnimationUtils {
        
        public static void expand(final View v) {
            v.measure(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            final int targtetHeight = v.getMeasuredHeight();
    
            v.getLayoutParams().height = 0;
            v.setVisibility(View.VISIBLE);
            Animation a = new Animation()
            {
                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    v.getLayoutParams().height = interpolatedTime == 1
                            ? LayoutParams.WRAP_CONTENT
                            : (int)(targtetHeight * interpolatedTime);
                    v.requestLayout();
                }
    
                @Override
                public boolean willChangeBounds() {
                    return true;
                }
            };
    
            a.setDuration((int)(targtetHeight / v.getContext().getResources().getDisplayMetrics().density));
            v.startAnimation(a);
        }
    
        public static void collapse(final View v) {
            final int initialHeight = v.getMeasuredHeight();
    
            Animation a = new Animation()
            {
                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    if(interpolatedTime == 1){
                        v.setVisibility(View.GONE);
                    }else{
                        v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                        v.requestLayout();
                    }
                }
    
                @Override
                public boolean willChangeBounds() {
                    return true;
                }
            };
    
            a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
            v.startAnimation(a);
        }
    }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow