Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형

안드로이드(Android) Animation 클래스 이용해 View, Layout 애니메이션 효과주기

 

개발환경 : window 7 64bit, Eclipse Mars, Android 4.2.2

 

안드로이드에서 제공하는 android.view.animation.Animation

이용해 View, LinearLayout 에도 애니메이션 효과를

적용할수 있습니다. 예제는 AnalogClock, LinearLayout

애니메이션 효과를 적용하였습니다.

 

 

이전 소스는 애니메이션 효과를 주기 위해

Xml 을 이용하였습니다. 이번에는 Animation 클래스를

상속받아 ViewAnimation 을 만들어 initialize(),

applyTransformation() 함수를 재구성 하였습니다.

 

public class ViewAnimation extends Animation {
	int centerX, centerY;

	@Override
	public void initialize(int width, int height, int parentWidth,
			int parentHeight) {
		super.initialize(width, height, parentWidth, parentHeight);
		setDuration(5000);
		setFillAfter(true);
		setInterpolator(new LinearInterpolator());
		centerX = width / 2;
		centerY = height / 2;
	}

	@Override
	protected void applyTransformation(float interpolatedTime,
			Transformation t) {
		final Matrix matrix = t.getMatrix();
		matrix.setScale(interpolatedTime, interpolatedTime);
	}
}

 

다음은 두개의 버튼에 대한 구현인데 각 버튼이벤트에

LinearLayout, AnalogClock 객체를 가져온후 Animation

상속받아만든 ViewAnimation 객체를 startAnimation()

함수의 인수로 넘깁니다.

private Button.OnClickListener startButton1OnClickListener 
		= new Button.OnClickListener() {

	public void onClick(View v) {
		LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
		linearLayout.startAnimation(new ViewAnimation());
	}
};

private Button.OnClickListener startButton2OnClickListener 
		= new Button.OnClickListener() {

	public void onClick(View v) {
		AnalogClock animation = (AnalogClock) findViewById(R.id.myclock);
		animation.startAnimation(new ViewAnimation());
	}
};

 

View 를 상속받은 모든 객체는 startAnimation() 함수를

지원하므로 어떤 객체든 애니메이션 효과를 적용할수 있습니다.

그러니까 ViewAnimation 클래스를 잘 다듬어서

유용하게 쓰일 일이 있을 겁니다.

아래는 메인 레이아웃에 대한 xml 입니다.

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mylayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/start1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="LinearLayout 에 애니메이션 효과 적용하기 " />

    <Button
        android:id="@+id/start2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="AnalogClock 에 애니메이션 효과 적용하기" />

    <AnalogClock
        android:id="@+id/myclock"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

 

메인 activity 의 전체 소스입니다.

import android.app.Activity;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.Transformation;
import android.widget.AnalogClock;
import android.widget.Button;
import android.widget.LinearLayout;

public class SampleActivity20 extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_sample_activity20);
		Button myStartButton1 = (Button) this.findViewById(R.id.start1);
		myStartButton1.setOnClickListener(startButton1OnClickListener);
		Button myStartButton2 = (Button) this.findViewById(R.id.start2);
		myStartButton2.setOnClickListener(startButton2OnClickListener);
	}

	private Button.OnClickListener startButton1OnClickListener 
			= new Button.OnClickListener() {

		public void onClick(View v) {
			LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
			linearLayout.startAnimation(new ViewAnimation());
		}
	};

	private Button.OnClickListener startButton2OnClickListener 
			= new Button.OnClickListener() {

		public void onClick(View v) {
			AnalogClock animation = (AnalogClock) findViewById(R.id.myclock);
			animation.startAnimation(new ViewAnimation());
		}
	};

	public class ViewAnimation extends Animation {
		int centerX, centerY;

		@Override
		public void initialize(int width, int height, int parentWidth,
				int parentHeight) {
			super.initialize(width, height, parentWidth, parentHeight);
			setDuration(5000);
			setFillAfter(true);
			setInterpolator(new LinearInterpolator());
			centerX = width / 2;
			centerY = height / 2;
		}

		@Override
		protected void applyTransformation(float interpolatedTime,
				Transformation t) {
			final Matrix matrix = t.getMatrix();
			matrix.setScale(interpolatedTime, interpolatedTime);
		}
	}
}

 

 

Animation 효과

반응형
Posted by 녹두장군1
,