Notice
Recent Posts
Recent Comments
Link
설.현.아빠
[2011.02.10] 이미지 애니메이션 효과주기(이미지 이동, 회전) 본문
흠...과연 단말에서 동작시켰을땐 어떻게 될까...애뮬에서는 약간 느리게 동작하는것 같아서 실망좀...
일단 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. */@Overridepublic 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; // 캐릭터의 폭과 높이/2int 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; // 캐릭터 폭/2cw = charater[1].getHeight() / 2; // 캐릭터 높이/2charater_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() { // 타이머로 사용할 Handlerpublic void handleMessage(Message msg) {invalidate(); // onDraw() 다시 실행mHandler.sendEmptyMessageDelayed(what , 10); // 10/1000초마다 실행// 적당히 2바퀴정도만 돌고 멈추자^^ 근데 저렇게 멈추는게 맞는지는 모르겠다.ㅋif(rotate == 720) {mHandler.removeMessages(what );mHandler=null;}}}; // Handler} // GameView 끝
} // 프로그램 끝
'안드로이드 > Animation' 카테고리의 다른 글
Widget: SlidingDrawer top to bottom (0) | 2012.02.17 |
---|---|
버튼 누를때 누른듯한 얍삽이 효과주기. (0) | 2011.02.18 |
화살표 이미지 깜빡이기 (1) | 2011.02.18 |
이미지 3개로 움짤만들기. (0) | 2011.02.18 |
Activity 전환시 애니메이션 효과 설정 하기. (0) | 2011.02.11 |
Comments