Notice
Recent Posts
Recent Comments
Link
관리 메뉴

설.현.아빠

[2011.02.10] 이미지 애니메이션 효과주기(이미지 이동, 회전) 본문

안드로이드/Animation

[2011.02.10] 이미지 애니메이션 효과주기(이미지 이동, 회전)

설.현.아빠 2011. 2. 11. 10:40



흠...과연 단말에서 동작시켰을땐 어떻게 될까...애뮬에서는 약간 느리게 동작하는것 같아서 실망좀...


일단 http://foxmann.blog.me/90095790218 , http://cafe.naver.com/dodo4989/222  이 두가지 포스트를 가지고 작업을 시작하였다.

XML도 필요없다. Bitmap으로 png파일 불러와서 이동시키고~돌리고~ㅋㅋㅋ



package lee.android.Game01;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Display;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class Game01 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(new GameView(this));
}

      // -----------------------------------------
      // 새로 만든 View
      // -----------------------------------------
class GameView extends View {
int width, height; // 화면의 폭과 높이
int x, y; // 캐릭터의 현재 좌표
int dx, dy; // 캐릭터가 이동할 방향과 거리
int cw, ch; // 캐릭터의 폭과 높이/2
int charater_width, charater_height; // 캐릭터의 폭과 높이
Bitmap charater[] = new Bitmap[2];
int counter = 0;
int rotate = 5; // 캐릭터의 회전 각
int what = 0;
     // -----------------------------------
     // 게임 초기화
     // -----------------------------------
public GameView(Context context) {
super(context);

// 화면의 크기 구하기.
Display display = ((WindowManager) context
.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
width = display.getWidth(); // 화면의 가로폭
height = display.getHeight(); // 화면의 세로폭
x = 100; // 캐릭터의 현재 x위치
y = 100; // 캐릭터의 현재 y위치
dx = 2; // 캐릭터가 x축으로 이동할 거리
dy = 5; // 캐릭터가 y축으로 이동할 거리

// 캐릭터 비트맵 읽기
charater[0] = BitmapFactory.decodeResource(getResources(),
R.drawable.rabbit_1);
charater[1] = BitmapFactory.decodeResource(getResources(),
R.drawable.rabbit_2);
cw = charater[0].getWidth() / 2; // 캐릭터 폭/2
cw = charater[1].getHeight() / 2; // 캐릭터 높이/2
charater_width=charater[0].getWidth();
charater_height=charater[0].getHeight();
// Handler는 외부에서 깨워주지 않으면 스스로는 움직이지 않는다.
// 아래와 같이 최초 한번은 Handler를 깨워주자.
mHandler.sendEmptyMessageDelayed(what , 10);
}

     // -----------------------------------------
     // 실제 그림을 그려주는 부분
     // -----------------------------------------
public void onDraw(Canvas canvas) {
x += dx; // 가로로 이동
y += dy; // 새로로 이동

if (x <= cw || x >= width - cw)
dx = -dx; // 벽이면 이동 방향을 바꿈.
if (y <= ch || y >= height - ch)
dy = -dy; // 천정이나 바닥이면 이동 방향을 바꿈.
counter++;
int n = counter % 20 / 10; // n값은 counter값을 10을 주기로 하여 0, 1로 변경됨.


    // 이부분에서 5도씩 rotate효과를 주고 새로운 Bitmap을 생성한다.
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
rotate += 5;
Bitmap newBitmap = Bitmap.createBitmap(charater[n], 0, 0, 
charater_width, charater_height, matrix, true);


canvas.drawBitmap(newBitmap, x - cw, y - ch, null);
// (bitmap, x, y, Paint) 이미지 가공이 필요없으므로 Paint는 null
}

     // -----------------------------------------
     // Timer Handler
     // -----------------------------------------
Handler mHandler = new Handler() { // 타이머로 사용할 Handler
public void handleMessage(Message msg) {
invalidate(); // onDraw() 다시 실행
mHandler.sendEmptyMessageDelayed(what , 10); // 10/1000초마다 실행
         // 적당히 2바퀴정도만 돌고 멈추자^^ 근데 저렇게 멈추는게 맞는지는 모르겠다.ㅋ
  if(rotate == 720) {
     mHandler.removeMessages(what );
  mHandler=null;
  }
}
}; // Handler
} // GameView 끝
} // 프로그램 끝

Comments