Android 애니메이션(애니메이션 보기,프레임 애니메이션,속성 애니메이션)상세 소개

0.머리말 
안 드 로 이 드 애니메이션 은 면접 때 자주 물 어 보 는 화제 다.우 리 는 모두 안 드 로 이 드 애니메이션 이 세 가지 로 나 뉘 는데 그것 이 바로 View 애니메이션,프레임 애니메이션 과 속성 애니메이션 이라는 것 을 안다.
먼저 이 세 가지 애니메이션 에 대해 개술 을 한다.
View 애니메이션 은 점진 적 인 애니메이션 으로 이미지 의 이동,확대,회전 과 투명도 등 각종 점진 적 인 변환 을 통 해 애니메이션 효 과 를 완성 합 니 다.
프레임 애니메이션 은 끊임없이 그림 전환 을 통 해 애니메이션 효 과 를 실현 한다.
속성 애니메이션 은 끊임없이 대상 의 속성 을 바 꾸 어 애니메이션 효 과 를 실현 합 니 다.본문 은 오리지널 이 므 로 전재 할 때 출처 를 밝 혀 주 십시오.
http://blog.csdn.net/seu_calvin/article/details/52724655
1.  애니메이션 보기 
1.1  시스템 에서 제공 하 는 네 가지 View 애니메이션(추가 애니메이션)
View 애니메이션 은 res/anim/name.xml 파일 에서 설정 할 수 있 습 니 다.네 가지 View 애니메이션 의 그 라 데 이 션 변환 은 각각,,,네 개의 탭 에 대응 하고 애니메이션 집합 은탭 을 사용 할 수 있 습 니 다.xml 의 각 애니메이션 속성 이 비교적 간단 합 니 다.여 기 는 인 스 턴 스 코드 를 붙 이지 않 습 니 다.설정 한 xml 파일 을 어떻게 사용 하여 애니메이션 을 시작 하 는 지 주의 하면 됩 니 다.
view.startAnimation(AnimationUtils.loadAnimation(this,R.anim.myanimation)); 
이것 은 물론 자바 코드 에서 도 설정 할 수 있 고 비교적 간단 합 니 다.여기에 예제 코드 를 썼 습 니 다.

splash = (RelativeLayout)findViewById(R.id.splash); 
//     
RotateAnimation rotateAnimation = new RotateAnimation(0,360, 
        Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); 
rotateAnimation.setDuration(2000); 
rotateAnimation.setFillAfter(true); 
//     
ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1, 
        Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); 
scaleAnimation.setDuration(2000); 
scaleAnimation.setFillAfter(true); 
//     
AlphaAnimation alphaAnimation = new AlphaAnimation(0.2f,1.0f); 
alphaAnimation.setDuration(2000); 
alphaAnimation.setFillAfter(true); 
//     
TranslateAnimation translateAnimation = newTranslateAnimation (0,0,100,100); 
translateAnimation.setDuration(2000); 
translateAnimation.setFillAfter(true); 
//     
AnimationSet animationSet = new AnimationSet(true); 
animationSet.addAnimation(rotateAnimation); 
animationSet.addAnimation(scaleAnimation); 
animationSet.addAnimation(alphaAnimation); 
animationSet.addAnimation(translateAnimation); 
//     
plash.startAnimation(animationSet); 

1.2   사용자 정의 애니메이션 보기
사용자 정의 애니메이션 의 실제 응용 에서 보기 드 물기 때문에 간단 한 소개 만 할 수 있 습 니 다.
사용자 정의 애니메이션 을 완성 하려 면 Animation 클래스 를 계승 하고 initialize()와 apply Transformation()을 다시 써 야 합 니 다.
전 자 는 초기 화 된 작업 에 사용 되 고 후 자 는 행렬 변환 에 사용 된다.
1.3     ViewGroup 의 모든 하위 요소 에 애니메이션 설정
위 1.1,1.2 는 모두 View 에 애니메이션 효 과 를 설정 하고 Android 역시 View Group 에 설정 을 제공 합 니 다.
android:layoutAnimation=”@anim/layout_anim'은 ViewGroup 의 모든 하위 요소 에 애니메이션 을 설정 하 는 목적 을 달성 합 니 다.다음은 관련 코드 를 드 립 니 다.

//res/anim/anim/layout_anim.xml 
<layoutAnimation xmlns:android=” http://schemas.android.com/apk/res/android” 
android:delay=”0.1” //       0.1*T,   100ms 
android:animationOrder=”normal” //             ,  reverse  random 
android: animation=” @anim/layout_anim_item”/> 
 
//res/anim/anim/layout_anim_item.xml 
<?xml version=”1.0” encoding=”utf-8”?> 
<set xmlns:android=”http://schemas.android.com/apk/res/android” 
 animation:duration=”200” //          T 
 animation:interpolator=”@android:anim/accelerate_ interpolator” //      
animation:shareInterpolator=”true”> //              
<alpha android:fromAlpha=”0.2” android: toAlpha =”1.0”/> 
<translate android:fromXDelta=”100” android: toXDelta =”0”/> 
</set> 
1.4     Activity 전환 을 위 한 애니메이션 설정
모두 가 사용 한 적 이 있 을 것 입 니 다.startActivity()이후 에 사용 하면 Activity 전환 시 이동 하 는 애니메이션 효 과 를 얻 을 수 있 습 니 다.
overridePendingTransition(R.anim.tran_in,R.anim.tran_out); 

//res/anim/tran_in 
<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:duration="500" 
//     100%     ,  tran_out   toXDelta="-100%p",     
android:fromXDelta="100%p" 
android:fromYDelta="0" 
  android:toXDelta="0" 
  android:toYDelta="0" > 
</translate> 

2.   프레임 애니메이션
위 에서 도 언급 했 듯 이 프레임 애니메이션 은 끊임없이 그림 을 전환 하여 애니메이션 효 과 를 실현 하 는 것 이다.OOM 이 쉬 운 것 이 분명 하기 때문에 프레임 애니메이션 을 사용 할 때 그림 의 크기 에 주의해 야 한다.
프레임 애니메이션 의 사용 도 간단 합 니 다.사용 예 는 다음 과 같 습 니 다.

//res/drawable/myanimation.xml 
<?xml version=”1.0” encoding=”utf-8”?> 
<animation-list xmlns:android=”http://schemas.android.com/apk/res/android” 
 animation:oneshot=”false” > //false     ,true    View   setFillAfter   
<item android: drawable =”@ drawable/ drawable 1” android:duration=” 200”> 
<item android: drawable =”@ drawable/ drawable 2” android:duration=” 200”> 
</animation-list> 
 
//                
view.setBackgroundResource(R.drawable.myanimation.xml); 
(AnimationDrawable)view.getBackground.start(); 
3.   속성 애니메이션
View 애니메이션 의 네 가지 효 과 는 현저 한 단점 이 있 습 니 다.그 려 진 효 과 는 View 의 속성 을 진정 으로 바 꾸 지 않 았 습 니 다.즉,left,top,right 와 bottom 의 값 은 시스템 이 임시로 그린 결과 일 뿐 입 니 다.이렇게 View 의 클릭 위 치 는 변 하지 않 았 다.이 문제 에 대해 안 드 로 이 드 3.0 부터 속성 애니메이션 이 생 겨 났 다.
속성 애니메이션 의 본질은 새로 추 가 된 속성(예 를 들 어 번역 X/Y,scaleX/Y 크기 조정,회전 rotationX/Y 등)을 바 꾸 고 화면 을 새로 고침 함으로써 애니메이션 효 과 를 실현 하 며 클릭 위치의 실시 간 변 화 를 실현 하 는 것 이다.그러나 속성 애니메이션 은 원본 상하 좌우 네 개의 값 을 수정 하지 않 습 니 다.마지막 으로 주의해 야 할 것 은 속성 애니메이션 은 View 뿐만 아니 라 모든 대상 에 도 사용 할 수 있다 는 것 이다.
속성 애니메이션 과 관련 된 클래스 와 방법 을 소개 합 니 다.
3.1  setTranslationX 방법
이 방법 은 애니메이션 효 과 를 사용 하지 않 아 도 되 기 때문에 view 속성 을 직접 변경 하 는 방법 입 니 다.

view.setTranslationX(x);//3.0   
ViewHelper.setTranslationX(view,x);//3.0    NineOldAndroid    
3.2   ValueAnimator 류

ValueAnimator          ,             ,           ,  onAnimationUpdate()           。
[java] view plain copy  CODE              
ValueAnimator animator = ValueAnimator.ofInt(1, 100); //    ,   1   100   
animator.addUpdateListener(new AnimatorUpdateListener() { 
  @Override 
  public void onAnimationUpdate(ValueAnimator animation){ 
    float fraction = animation.getAnimatedFraction();//     0-1 
    //           start+(end-strat)*fraction,          
    view.getLayoutParams().width = new IntEvaluator().evaluate(fraction,start,end) //   set   
    view.requestLayout(); 
  } 
}); 
animator.setDuration(1000).start(); 

3.3    ObjectAnimator 클래스
ObjectAnimator 는 ValueAnimator 로부터 계승 되 었 습 니 다.view 의 속성 을 직접 바 꿀 수 있 습 니 다.다음은 하나의 예 를 통 해 소개 합 니 다.

//x         
ObjectAnimator animator = ObjectAnimator.ofFloat(view,”scaleX”,2.0f); 
animator.setDuration(1000); 
animator.setStartDelay(1000); 
animator.start(); 
대부분의 경우 ObjectAnimator 를 사용 하면 충분 합 니 다.ValueAnimator 처럼 애니메이션 업데이트 논 리 를 직접 쓰 지 않 아 도 되 지만 ObjectAnimator 는 일정한 제한 이 있 습 니 다.목표 속성 이 지정 한 처리 방법(예 를 들 어 get/set 방법 제공)을 제공 해 야 합 니 다.이것 은 ObjectAnimator 의 원 리 는 set 방법 으로 속성 값 을 업데이트 하 는 것 입 니 다.또한 우리 가 초기 값 을 전달 하지 않 으 면 시스템 은 get 방법 으로 값 을 가 져 옵 니 다.위의 3.2 에서 소개 한 ValueAnimator 는 속성 값 을 직접 조작 하지 않 기 때문에 대상 의 속성 을 조작 하려 면 se/get 방법 이 필요 하지 않 습 니 다.현재 애니메이션 의 계산 을 통 해 모든 속성 을 수정 할 수 있 습 니 다.
이 문제 에 대해 공식 적 으로 우 리 는 원시 대상 을 포장 하고 간접 적 으로 get/set 방법 을 제공 하 는 것 을 추천 합 니 다.실현 하기 가 매우 간단 합 니 다.실례 는 다음 과 같 습 니 다.

ViewWrapper wrapper = new ViewWrapper(view); 
ObjectAnimator.ofInt(view,”width”,200).setDuration(1000).start(); 
 private static class ViewWrapper{ 
  private View myView; 
 public ViewWrapper(View view){ 
  myView = view; 
 } 
 public int getWidth(){ 
  return myView.getLayoutParams().width; 
 } 
 public int setWidth(int width){ 
 myView.getLayoutParams().width = width; 
 myView.requestLayout(); 
 } 
} 

3.4  View Property 애니메이션 클래스
View Property Animation 은 Nine Old Android 라 이브 러 리 의 클래스 로 Object Animatior 류 의 조작 을 간소화 하고 Nine Old Android 라 이브 러 리 는 3.0 이전 Android 버 전 을 호 환 합 니 다.다음은 하나의 예 를 거 쳐 소개 한다.

//x        ,   3.3 
ViewPropertyAnimation.animate(view).scaleX(2.0f).setDuration(1000) 
.setInterpolator(new OvershootInterpolator()) 
.setStartDelay(1000).start(); 
3.5  AnimationSet 클래스
애니메이션 집합 은 여러 애니메이션 을 하나의 조합 으로 조합 하 는 체 제 를 제공 하고 애니메이션 의 순서 관 계 를 설정 할 수 있 습 니 다.예 를 들 어 시간 재생,순서 재생 또는 지연 재생 과 같 습 니 다.구체 적 인 사용 방법 은 비교적 간단 하 다.다음 과 같다.

ObjectAnimator objectAnimator1= ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0f);  
ObjectAnimator objectAnimator2= ObjectAnimator.ofFloat(view, "translationY", 0f, 30f);  
ObjectAnimator objectAnimator3= ObjectAnimator.ofFloat(view, "translationX", 0f, 30f);  
AnimatorSet animatorSet = new AnimatorSet();  
animatorSet.setDuration(5000);  
animatorSet.setInterpolator(new LinearInterpolator());   
// animatorSet.playTogether(objectAnimator1, objectAnimator2. objectAnimator3); //          
// 12    ,3      
animatorSet.play(objectAnimator1).with(objectAnimator2);  
animatorSet.play(objectAnimator3).after(objectAnimator2);  
animatorSet.start(); 
4.  플러그 인 총결산
4.1  시스템 이 우리 에 게 제공 한 플러그 인
각종 플러그 인 은 Interpolator 인 터 페 이 스 를 실 현 했 습 니 다.시스템 이 직접 사용 할 수 있 는 플러그 인 을 살 펴 보 겠 습 니 다.

 4.2  사용자 정의 플러그 인
Interpolator 는 모두 Interpolator 인 터 페 이 스 를 실 현 했 고 Interpolator 인 터 페 이 스 는 TimeInterpolator 에서 계승 되 었 다.TimeInterpolator 인 터 페 이 스 는 시스템 에서 호출 된 getInterpolation(float input)방법 을 정의 했다.그 중에서 매개 변수 input 는 애니메이션 의 완성 진 도 를 나타 내 고 0 과 1 사이 에 있다.사용자 정의 플러그 인 은 Interpolator 인 터 페 이 스 를 실현 하고 getInterpolation()방법 을 덮어 쓰 면 사용자 정의 애니메이션 효 과 를 실현 할 수 있 습 니 다. 
다음은 애니메이션 의 시작 과 끝 속도 가 느 리 고 중간 에 가속 하 는 AccelerateDecelerateInterpolator 플러그 인 입 니 다.

public class AccelerateDecelerateInterpolator extends BaseInterpolator 
    implements NativeInterpolatorFactory { 
  ...... 
  public float getInterpolation(float input) { 
    return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; 
  } 
  ...... 
} 

5.  애니메이션 모니터
우 리 는 평소에 개발 하 는 과정 에서 애니메이션 이 완 성 된 시 기 를 감청 하여 업무 논 리 를 계속 해 야 한다.그러면 우 리 는 애니메이션 집합 에 Animation Listener 감청 기 를 설정 하여 실현 할 수 있다.애니메이션 시작,종료,취소,반복 재생 을 감청 할 수 있 습 니 다.

//       
animationSet.setAnimationListener(new Animation.AnimationListener() { 
  @Override 
  public void onAnimationStart(Animation animation) {} 
  @Override 
  public void onAnimationEnd(Animation animation) {} 
  @Override 
public void onAnimationRepeat(Animation animation) {} 
@Override 
  public void onAnimationCancel(Animation animation) {} 
}); 
마지막 으로 애니메이션 의 모든 프레임 의 리 셋 을 감청 하려 면 Animator UpdateListener 모니터 를 설정 하고 onAnimationUpdate()방법 을 다시 쓰 면 됩 니 다.
이로써 안 드 로 이 드 애니메이션 에 대한 지식 을 총 결 하 였 습 니 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기