'애니매이션'에 해당되는 글 2건

  1. 2015.03.30 안드로이드 애니메이션2
  2. 2015.03.25 안드로이드 애니매이션1 (Animation)


●예제

- 쓰레드를 이용하여 사용자가 직접 애니매이션 효과를 만들어 본다. 아래 예제는 화면을 터치하면 이미지가 움직이는 예제이다.


- AniActivity.java

package study.thread;


import com.example.day0328.R;


import android.app.Activity;

import android.os.Bundle;


public class AniActivity extends Activity{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.ani_layout);

}

}




- MyView.java

package study.thread;


import com.example.day0328.R;


import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.os.Handler;

import android.os.Message;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;


public class MyView extends View{


Bitmap bitmap;

int x, y;

Thread thread;

Handler handler;

public MyView(Context context, AttributeSet attrs) {

super(context, attrs);

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

handler = new Handler(){

//자식쓰레드가 요청한 업무를 수행하는 메서드 재정의

public void handleMessage(Message msg) {

move();

}

};

thread = new Thread(){

public void run() {

super.run();

//쓰레드가 죽지않고 계속 진행되려면 run()의 받는 괄호를 만나게 해서는 안된다.

while(true){

//move();

//메인쓰레드에게 move호출을 부탁

//핸들러에게 handleMessage()를 수행하게 한다.

try {

Thread.sleep(500);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

handler.sendEmptyMessage(0);

}

}

};

}

//모든 위젯은 스스로를 그릴때, onDraw메서드를 호출하게 돼있다.

//따라서 개발자가 이 시점에 원하는 그래픽 처리를 할 수 있다.

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//비트맵 이미지를 올려놓고 자동으로 이동하는 효과

canvas.drawBitmap(bitmap, x, y, null);

}

//그림을 이동시키는 메서드

public void move(){

x+=5;

y+=5;

//현재 화면의 뷰에 그려진 그림을 지우고 다시 갱신

//자바표준에서는 repaint()라는 것이 있다.

invalidate();

}

public boolean onTouchEvent(MotionEvent event) {

thread.start();

return super.onTouchEvent(event);

}

}


 



- ani_layout.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    

    <study.thread.MyView 

        android:id="@+id/myView"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:background="#ffdd00"/>

    

</LinearLayout>











Posted by -현's-

댓글을 달아 주세요


●애니매이션(Animation)

- 안드로이드 자체적으로 간단한 에니메이션 효과가 지원된다. 


- 안드로이드에서는 트윈 에니메이션을 지원한다. 일반적인 프레임에니메이션과는 차이가 있다.

 * 프레임 에니메이션 - 여러장의 이미지를 짧은 시간에 보여줘서 움직이는 것처럼 보여줌

 * 트윈 에니메이션- 시작부터 마지막 사이의 에니메이션 효과를 내부적으로 예측 연산하여 보여줌


- 안드로이드에서 제공하는 시스템 애니매이션은 호출만 하면 된다. 대신 종류가 적다. 그래서 개발자가 직접 애니매이션을 제작해야 할 경우 쓰레드(Thread)를 이용해서 제작한다.


- res/anim 안에 애니매이션 효과에 관한 xml파일을 만든 후 이 xml을 위젯에 적용한다.






트윈 에니메이션 예제


- AniActivity.java

package study.system.ani;


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.animation.Animation;

import android.view.animation.AnimationUtils;

import android.widget.Button;

import android.widget.ImageView;


import com.example.day0321.R;


public class AniActivity extends Activity implements OnClickListener{

Button btn_ani;

ImageView img_ani;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.scale_main);

btn_ani = (Button)findViewById(R.id.btn_ani);

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

btn_ani.setOnClickListener(this);

}


public void onClick(View v) {

Animation ani = AnimationUtils.loadAnimation(this, R.anim.scale);

//레이아웃을 포함한 모든 위젯은 시스템 에니메이션의 대상이 된다.

btn_ani.startAnimation(ani);

img_ani.startAnimation(ani);

}

}




- scale.xml

<?xml version="1.0" encoding="utf-8"?>

<scale

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:fromXScale="1.0"

    android:fromYScale="1.0"

    android:toXScale="5.0"

    android:toYScale="5.0"

    android:pivotX="50%"

    android:pivotY="50%"

    android:duration="5000">

    

</scale>




- scale_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:gravity="center" >

    

    <Button 

        android:id="@+id/btn_ani"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="버튼"/>

    

<ImageView 

   android:id="@+id/img_ani"

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"

   android:src="@drawable/ic_launcher"/>    

    

</LinearLayout>

 











Posted by -현's-

댓글을 달아 주세요