달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
728x90
반응형

안드로이드 - 카메라에 이미지 떠다니기

봄이와 원본 출처 http://vissel.tistory.com/207
2010/08/03 23:07

안드로이드펍에 쪽지 드린 인 이에요^^ 친전한 답변 감사드리구요,,,

제가 혼자 책보고 공부를 시작하는 단계라,, 모르는게 많아서요,, 파라미터이런게 먼지 모르겠네요~~^^
소스를 가르쳐 달라는건 아니구요,, 가이드를 제시해 주시면 좋겠습니당~~

제가 할려고 하는게요,,, 카메라 띄운 화면상태에서 작은 이미지가 돌아 다니는 거거든요. 시작 위치는 랜덤이고, 화면이 끝나는 지점 어디든 도달하면 사라지구요,,, 사라지기 전에 터치로 그 이미지를 눌르게 되면, 이미지는 사라지고, 점수가 올라가는? 그런 간단한 게임을 만들고자 하고 있어요~~

지금까지 한게,,,
main.Xml을 FrameLayout으로 만들어서 카메라 SurfaceView를 올리구요,,,
FrameLayout 안에 AbsoluteLayout만들고 그 안에 ImageView 만들어서 위치 지정하고 이미지를 올렸구요,

지금 상태가 카메라 화면에 안 움직이는 이미지 하나 떠있는,,,-.- 암울한 상태에요,,,ㅋ
레이아웃에 이미지를 올려서 어떤식으로 움직여야 하는지,,, 레이아웃은 머든 상관은 없구요,, 이미지가 하나가 아니고 여러개가 랜덤으로 나왔다 사라져야 하기 때문에 쫌 복잡할거 같네요.


=====================================================================================================================================


프리뷰 위에 이미지 떠다니는건 생각만큼 어렵지 않습니다.

다만 이미지를 랜덤으로 띄운다던가 아니면 이벤트를 줄때 속도를 높이기위해서 하는 작업들이 더 신중해야 한다는거 !!!

일단은 처음 부터 차근차근 해봅시다!

막히는건 같이 풀어가면 되는거고 ㅎ

일단 프리뷰 띄우는건


2010/07/20 - [멀티미디어/Camera] - 카메라 강좌 !!! 사진 찍고 저장해보자


이곳에서 했으니깐 참고 하시고

다음으로 프리뷰 화면위에 이미지를 띄우겠습니다.

이미지는 애니메이션을 넣을지 음 효과를 넣을지는 개발자가 선택할 일이고 또 어렵지 않으니 기본작업 마치고 필요하시면 같이 해봐요 ㅎ

일단 화면위에 이미지를 띄울려면 가장 간단한 이미지뷰를 써야 겠죠

당연히 xml에서 이미지뷰를 만들어줘야겠죠

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background = "@drawable/icon"

/>



아이콘으로 띄웠습니다.

그럼 이놈의 위치를 랜덤으로 옮겨봅시다.

먼저 자바에서 쓰는 랜덤 함수를 불러 와서 써야겠네요 .

Random 함수겠죠

Ran_move = new Random();

move_X = Ran_move.nextInt(800) + 1;

move_Y = Ran_move.nextInt(480) + 1;


이렇게 하면 휴대폰 보통 800x480 해상도 니깐

x좌표를 1에서 800까지 랜덤하게 숫자 생성하고

y좌표는 1부터 480까지 랜덤하게 생성하여 (x,y)를 랜덤하게 좌표 지정 해주게 됩니다.

좌표는 됬으니 그럼 계속 움직여야 하는데 그건 어떻게 하는가 하는 방법에는 많은 방법이 있습니다.

타이머를 써도 되고
2010/08/03 - [Thread/Timer] - 타이머를 쓰레드 처럼 돌리자

딜래이를 줘도 되고

2010/08/04 - [Thread/Timer] - 딜래이 주기


쓰레드를 줘도 됩니다.

간단한 방식이요 ㅎㅎ 게임이라 다른 엔진이있을진 모르겠지만 간단한 게임이니;; ㅎㅎ

전 쓰레드를 줘봤어요 ㅎㅎ

2010/02/02 - [Thread/Timer] - Thread 를 ~ 쓰레드를~ 사용하기//무한루프를 탈출.



void startHeavyDutyStuff() {


mTimerThread = new Thread() {

public void run() {

mThreadTimer_t = true;

while (mThreadTimer_t) {

Log.e("Thread", "run...");

try {

Thread.sleep(1 * 600);

messageHandler.sendMessage(Message.obtain(messageHandler,0x10));

} catch (InterruptedException e) {

}

}

}

};

mTimerThread.start();

}

이런식으로 간단하게 쓰레드를 함수를 생성하고 핸들러를 사용하여 0.6초마다 호출합니다.

messageHandler.sendMessage(Message.obtain(messageHandler,0x10));요넘이요

그럼 핸들러는 어떻게 하느냐
2010/04/21 - [Handler] - 기본 핸들러 액티비티 안에서 이동

참조하시고



private Handler messageHandler = new Handler() {

@Override

public void handleMessage(Message msg) {


switch (msg.what) {

case 0x10:

move_X = Ran_move.nextInt(800) + 1;

move_Y = Ran_move.nextInt(480) + 1;

Log.e("move_X ="+move_X+"","move_Y ="+move_Y+"");

RelativeLayout.LayoutParams params = null;

params = (RelativeLayout.LayoutParams) Move_image.getLayoutParams();

params.leftMargin = move_X;

params.topMargin = move_Y;

Move_image.setLayoutParams(params);

case 0x20:

break;

}

}

};

이런식으로 했습니다.


move_X = Ran_move.nextInt(800) + 1;

move_Y = Ran_move.nextInt(480) + 1;

Log.e("move_X ="+move_X+"","move_Y ="+move_Y+"");

RelativeLayout.LayoutParams params = null;

params = (RelativeLayout.LayoutParams) Move_image.getLayoutParams();

params.leftMargin = move_X;

params.topMargin = move_Y;

Move_image.setLayoutParams(params);

요넘을 분석해 보자면 0.6초마다 이놈을 계속 호출할테니 그때마다 새로운 좌표를 얻기위해서

move_X = Ran_move.nextInt(800) + 1;

move_Y = Ran_move.nextInt(480) + 1;

변수를 새로 받아왔구요

파라미터를 이용하여

RelativeLayout.LayoutParams params = null;

params = (RelativeLayout.LayoutParams) Move_image.getLayoutParams();

params.leftMargin = move_X;

params.topMargin = move_Y;

Move_image.setLayoutParams(params);

릴래이티브 레이아웃의 이미지뷰 위치를 계속 이동하였습니다.


그럼 하나뿐이지만 실행해 볼까요

먼저 좌표 부터 로그 확인해봐요


계속 랜덤하게 좌표를 가져 오네요 그럼

실제로 잘이동하는지 봅시다.



ㅎㅎ 잘움직죠?? 스무스 하게 움직이는 방법도 많으니깐 잘 찾아보시면 좀더 부드럽게 움직이겠죠

그럼 다음 단계인 움직이는 이미지 누르면 이벤트 주거나 없애기? 없애기야 invisible 하면 되니깐

누르면 토스트 띄우는걸로 해볼꼐요


-_-0.6초는 너무 빠른가여 캡쳐 뜨느라 이미지 누르느라 ;;; 빡씸 ㅋㅋㅋ

터치 이벤트 등록하는 방법 볼께요

Move_image = (ImageView)findViewById(R.id.move_image);

Move_image.setOnTouchListener(move_icon);

아까 처음에 이미지뷰를 소스에서 연결해줘야겠죠

그다음에 터치이벤트에 등록하고



View.OnTouchListener move_icon = new View.OnTouchListener() {


public boolean onTouch(View v, MotionEvent event) {

ToastTest();

return false;

}

};


private void ToastTest(){

Toast.makeText(this, "잡았다", Toast.LENGTH_SHORT).show();

}


이렇게 해주면 딱 되겠죠?? 한번해보세요 ㅎㅎ

좀더 궁금하신 점은 댓글로 ㅎ

728x90
반응형
:
Posted by mapagilove