본문으로 바로가기
반응형

Tweened Animation이란?


연산을 통해서 Animation 효과를 만드는 방법을 말합니다.
쉽게 풀어서 얘기하면 view의 위치를 이동, 회전, 확대/축소, 투명도 조절을 할 수 있습니다.

 을 적용할 수 있는 대상은 View나 layout이며, 보통 xml로 동작을 지정하고, AnimationUitls.loadAnimation()을 이용하여, view에 적용합니다.


확대/축소 - scale

확대 축소를 하는 action은 scale을 이용합니다. 
먼저 res/anim 폴더를 만들고 scale 조정을 위한 xml을 만듭니다.

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2500"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="2.0"
    android:toYScale="2.0"
    />

확대 후에 축소를 하고 싶다면 xml을 set으로 묶어서 진행 하면 됩니다.

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:duration="2500"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="2.0"
        android:toYScale="2.0"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <scale
        android:startOffset="2500"
        android:duration="2500"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0.5"
        android:toYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%"
        />
</set>

startOffset은 시작하는 시간을 설정하므로 두번째 scale은 첫번째 scale일 끝난 뒤 시작됩니다.
또한 간단하게 처음 scale 속성에 repoeatMode="reverse"를 지정하면 두번째 scale 없이도 반대방향 효과를 보이게 됩니다. (이때 repeatCount는 1 이상이거나 무한반복이어야 합니다.)


이동 - translate

위치이동은 view나 layout을 한곳에서 다른곳으로 부드럽게 이동시킵니다
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0%p"
        android:toXDelta="100%p"
        android:duration="5000"
        android:repeatCount="1"
        android:fillAfter="true"
        />
</set>

회전 - ratate

대상을 한점 기준으로 회전시킵니다.

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="3000"
         />
</set>

기준값은 왼쪽상단 끝이기 때문에 필요한 경우  pivot으로 중심점을 지정합니다. 


투명도 - alpha

뷰의 투명도를 결정하며 0.0~1.0 사이의 값을 같습니다. (0 = 완전투명, 1 = 완전 불투명)

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        android:duration="10000"
        />
</set>


Animation 효과 -Interpolator

Animation 구동시 좀더 실감나는 효과를 주기 위해서 Interpolator를 사용할 수 있습니다.


AnimationListener

animation의 시작, 종료, 반복시 listener를 등록하여 해당 시점을 알수 있습니다.


사용예시


public class MainActivity extends AppCompatActivity {
    Animation mAnim1;
    Animation mAnim2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAnim1 = AnimationUtils.loadAnimation(getApplicationContext(), 
                                                     R.anim.rotation);
        mAnim1.setInterpolator(getApplicationContext(), 
                                        android.R.anim.accelerate_interpolator);
//        mAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha);
//        mAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.translate);
//        mAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.scale2);

        // 버튼 클릭시 animation 시작
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.startAnimation(mAnim1);
            }
        });

        mAnim2 = AnimationUtils.loadAnimation(getApplicationContext(), 
                                                               R.anim.rotation);
        mAnim2.setInterpolator(getApplicationContext(),
                              android.R.anim.anticipate_overshoot_interpolator);

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setAnimation(mAnim2);
        //Animation listener 등록
        button2.setAnimationListener(new AnimationAdapter());
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        // 화면이 loading되면 animation 시작
        if (hasFocus) {
            mAnim2.start();
        } else {
            mAnim2.reset();
        }
    }

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    }

   //애니메이션 리스너 
    private final class AnimationAdapter implements Animation.AnimationListener {

        public void onAnimationStart(Animation animation) {
            Toast.makeText(getApplicationContext(), "Animation started.", Toast.LENGTH_LONG).show();
        }

        public void onAnimationEnd(Animation animation) {
            Toast.makeText(getApplicationContext(), "Animation ended.", Toast.LENGTH_LONG).show();
        }

        public void onAnimationRepeat(Animation animation) {

        }

    }
}


반응형

'개발이야기 > Android' 카테고리의 다른 글

Android Service간 통신 #2  (0) 2017.10.11
Android Service간 통신 #1  (6) 2017.10.10
SSL  (0) 2017.10.08
Android 애니메이션#1 - Thread & ImageSwitcher  (2) 2017.10.08
Android 프로젝트 Stan에서 보기  (0) 2017.10.07