IT_Programming/Android_Java

[안드로이드] 안드로이드 애니메이션 효과 및 기능

JJun ™ 2014. 11. 3. 02:18



 출처: http://arrkaize86.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98-%ED%9A%A8%EA%B3%BC-%EB%B0%8F-%EA%B8%B0%EB%8A%A5




* 애니메이션 효과

: 안드로이드는 뷰의 간단한 변형을 줄 수 있는 애니메이션 처리를 지원한다. 이는 레이아웃 애니메이션과 각 구성요소의 애니메이션으로 나눌 수 있다.

 

 

* 애니메이션 종류

: 종류는 아래와 같으며, () 는 클래스명으로 android.view.animation.Animation 의 하위 클래스이다. Animation 객체를 상속받아 애니메이션 효과를 구현할 수 있다.

 

- 투명도 변환(AlphaAnimation)

- 회전(RatateAnimation)

- 크기 변환(ScaleAnimation)

- 위치 이동(TranslateAnimate)

 

 

* 애니메이션 정의(xml)

: 애니메이션 기능을 xml로 정의하여, 해당 xml 을 호출하여 애니메이션 기능을 구현할 수 있다.

  xml 파일은 프로젝트 내의 res/anim/ 폴더 내에 정의되어야 한다.

 

 

* 애니메이션 종류별 속성

종류

속성값

내용

alpha(투명도)

fromAlpha

toAlpha

...

fromAlpha -> toAlpha 투명도를 변경

ex) fromAlpha="1.0" / toAlpha="0.0" (점점 투명해짐)

fromAlpha="0.0" / fromAlpha="1.0" (점점 나타남)

scale(크기)

fromXScale

toXScale

fromYScale

toYScale

pivotX

pivotY

fillAfter

fillBefore

...

fromXScale -> toXScale 좌우 크기 변경

fromYScale -> toYScale 상하 크기 변경

ex) fromXScale="1.0" / toXScale="1.4" / fromYScale="1.0" / toYScale="1.4"

(1.0 -> 1.4 상하좌우 크기 변경)

rotate(회전)

fromDegrees

toDegrees

toYScale

pivotX

pivotY

startOffset

...

fromDegrees -> toDegrees 각도 회전

ex) fromDegrees="90" / toDegrees="0" (90도 -> 0도 회전)

fromDegrees="0" / toDegrees="90" (0도 -> 90도 회전)

translate(이동)

toXDelta

toYDelta

...

fromXDelta -> toXDelta 좌우로 이동

fromYDelta -> toYDelta 상하로 이동

ex) fromXDelta="100%p" / toXDelta="0" (좌->우 이동)

fromYDelta="100%p" / toYDelta="0" (상->하 이동)


 

 

* 애니메이션 구현 방법


1. xml 파일을 이용한 구현(/res/anim/)



1) 먼저 애니메이션을 구현할 xml 파일을 생성한다.


예문) /res/anim/alpha_ani.xml 파일 생성

=> 투명도 효과를 사용하는 alpha 를 선언

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="5000"/>


 


2) Animation 객체를 선언하고 AnimationUtils.loadAnimation() 함수를 통해 위의 xml 파일을 할당해준다.


예문) Animation alphaAni 선언 및 위의 xml 파일을 할당

=> 투명도 효과를 사용하는 alpha Animation 선언

private Animation alphaAni;

alphaAni = AnimationUtils.loadAnimation(this, R.anim.alpha_ani);


 


3) Animation 효과를 적용할 객체에 startAnimaion() 함수를 통해 기능을 부여한다.


예문) 이미지뷰를 선언하고 해당 이미지뷰에 Animation 효과를 할당

private ImageView imgLava;

imgLava.startAnimation(alphaAni);


 




 

2. 소스 코드를 이용한 구현



1) 사용할 애니메이션 객체를 선언한다.


예문) 투명도 효과인 AlphaAnimation 객체 선언

Animation ani01 = new AlphaAnimation(0.0f, 1.0f);

ani01.setDuration(5000);


 


2) 애니메이션 효과를 적용할 객체에 setAnimation() 함수를 통해 기능을 부여한다.


예문) 이미지뷰를 선언하고 이미지 효과 부여

ImageView imgLava = (ImageView) findViewById(R.id.imgLava);

imgLava.setAnimation(ani01);


 

 




3. 여러 개의 애니메이션 효과 구현

: 애니메이션 효과를 구현할 때 한가지만이 아닌 여러 개의 애니메이션 효과를 주고 싶을 경우가 있을 것이다.
  이때 사용하는 방법으로 set 을 이용한 방법이 있다. 해당 방법도 xml 파일과 소스 코드에서 모두 구현이 가능하다.



1) xml 파일 이용

: xml파일을 이용할 경우 <set></set> 태그를 통해 공통의 설정값은 set 태그 내에 넣고 애니메이션 테그를 세부 탭으로 넣어 사용할 수 있다.
  아래 예문을 통해 확인해보면 그리 어렵지 않게 구현이 가능한 것을 확인할 수 있다.

예문) 회전과 크기 변경의 애니메이션 효과를 동시에 사용

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:duration="5000">
    
  <rotate
        android:fromDegrees="0"
        android:toDegrees="90"
        android:fillAfter="true"
        android:startOffset="800"/>
        
 <scale
     android:fromXScale="1.0"
     android:toXScale="1.4"
     android:fromYScale="1.0"
     android:toYScale="1.4"
     android:pivotX="50%"
     android:pivotY="50%"
     android:fillAfter="false"
     />
   
</set>


 



2) 소스 코드를 이용

: 소스의 경우에도 마찬가지로 AnimationSet 객체를 선언하고 사용할 애니메이션을 선언하여 addAnimation() 함수를 통해 여러 애니메이션을 적용할 수 있다.
  말로 설명하는 것은 어려워 보이니 아래 예문을 통해 쉽게 알아보도록 하자~!


예문) AlphaAnimation 과 RotateAnimation 효과를 일괄 적용

ImageView imgLava = (ImageView) findViewById(R.id.imgLava);

 

AnimationSet set = new AnimationSet(true);
set.setInterpolator(new AccelerateInterpolator());

 

Animation ani01 = new AlphaAnimation(0.0f, 1.0f);
ani01.setDuration(5000);

 

Animation ani02 = new RotateAnimation(0, 90);
ani02.setDuration(5000);

 

set.addAnimation(ani01);
set.addAnimation(ani02);

imgLava.setAnimation(set);