Android
애니메이터
수색…
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
등)에 애니메이션을 적용하는 간단한 방법을 제공합니다.
그것을 사용하는 일반적인 방법은 다음과 같습니다.
- 값을
min
에서max
움직이게하는ValueAnimator
를 만듭니다. - 계산 된 애니메이션 값을 사용할
UpdateListener
를 추가하십시오 (getAnimatedValue()
얻을 수getAnimatedValue()
).
ValueAnimator
만들 수있는 두 가지 방법이 있습니다.
(예시적인 코드는 애니메이션 float
에서 20f
까지 40f
에서 250ms
)
-
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();
- 코드에서 :
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
)
-
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();
- 코드에서 :
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
ViewPropertyAnimator
는 View
속성을 애니메이션으로 만드는 단순화되고 최적화 된 방법입니다.
모든 단일 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);
}
}