Android 게임 개발:제스처 동작 으로 그림 을 전환 하 는 인 스 턴 스 구현

안 드 로 이 드 에 대한 제스처 는 소프트웨어 에서 만 자주 사용 되 는 것 이 아니 라 브 라 우 저의 페이지 넘 기기,페이지 스크롤 등 이다.물론 우리 가 안 드 로 이 드 게임 을 개발 할 때 안 드 로 이 드 제스처 조작 을 더 하면 게임 에 하 이 라 이 트 를 추가 할 수 있다.예 를 들 어 일반적인 CAG,PUZ 등 유형의 게임 선택 관문,간단 한 배경의 이동 등 은 모두 제스처 로 조작 하면 된다.예전 에 인기 가 많 았 던 와 같이 작은 새 는 정말 좋 았 다.내 가 본 유일한 하 이 라 이 트 는 이 게임 의 아이디어!솔직히 지금의 게임 은 못 하 는 것 이 없고 생각 나 지 않 는 좋 은 아이디어 만 있다.화제 로 돌아 와 안 드 로 이 드 제스처 가 무엇 인지 알 아 보 겠 습 니 다!
       제스처 인식 개술
       제스처 조작 이란 댄스 머 신,EZdancer 등 서로 다른 동작 과 음 표를 이용 하여 사람 을 춤 추 게 하 는 것 과 같다.그러면 안 드 로 이 드 의 제스처 는 우리 로 하여 금 게임 과 소프트웨어 에서 의 조작 에 더 많은 무늬 와 게임 방법 을 가지 게 할 뿐이다.게이머 들 이 화면 에 접촉 하 는 시간의 장단 에 따라 화면 에서 미 끄 러 지 는 거리,들 어 올 리 는 시간 등 을 누 르 고 포장 했다.사실은 안 드 로 이 드 가 터치 스크린 처리 에 대해 포장 과 처 리 를 한 것 이다.
       그렇다면 안 드 로 이 드 에는 두 가지 제스처 인식 기술 이 있다.하 나 는 터치 스크린 제스처 인식 이 고,다른 하 나 는 입력 법 제스처 인식 이다.둘 을 비교 해 보면 두 번 째 는 비교적 유연 하고 제스처 를 사용자 정의 할 수 있 으 며 비교적 높다!그러면 이 절 에서 첫 번 째 제스처 인식:터치 스크린 제스처 인식 을 소개 합 니 다.다음 블 로그 에 서 는 어린이 신발 들 에 게 입력 법 제스처 인식 을 설명해 드 리 겠 습 니 다!
       제스처 인식 인 스 턴 스
       먼저 두 장의 캡 처 를 올 려 주세요.

       OK,코드 먼저 올 리 기:
       MySurfaceView.java
자바 코드

package com.himi;  
import java.util.Vector;  
import android.content.Context;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.util.Log;  
import android.view.GestureDetector;  
import android.view.MotionEvent;  
import android.view.SurfaceHolder;  
import android.view.SurfaceView;  
import android.view.View;  
import android.view.GestureDetector.OnGestureListener;  
import android.view.SurfaceHolder.Callback;  
import android.view.View.OnTouchListener;  
/** 
 *@author Himi 
 *@ Gesture (  )        
 */ 
public class MySurfaceViewAnimation extends SurfaceView implements Callback,  
    Runnable, OnGestureListener, OnTouchListener {  
  private Thread th = new Thread(this);  
  private SurfaceHolder sfh;  
  private Canvas canvas;  
  private Paint paint;  
  private Bitmap bmp;  
  private GestureDetector gd;  
  private int bmp_x, bmp_y;  
  private boolean isChagePage;  
  private Vector<String> v_str;//   1  
  public MySurfaceViewAnimation(Context context) {  
    super(context);  
    v_str = new Vector<String>();  
    this.setKeepScreenOn(true);  
    bmp = BitmapFactory.decodeResource(getResources(),  
        R.drawable.himi_dream);  
    sfh = this.getHolder();  
    sfh.addCallback(this);  
    paint = new Paint();  
    paint.setAntiAlias(true);  
    this.setLongClickable(true);  
    // setLongClickable( true )    ,       ,  
    //      SurfaceView(view)            ;  
    //   :ACTION_MOVE,    ACTION_DOWN  
    this.setOnTouchListener(this);//             
    gd = new GestureDetector(this);  
    gd.setIsLongpressEnabled(true);  
  }  
  public void surfaceCreated(SurfaceHolder holder) {  
    //              view         view   !!                  !  
    //            ,          , view    ,      unlockCanvasAndPost       !  
    bmp_x = (getWidth() - bmp.getWidth()) >> 2;  
    bmp_y = (getHeight() - bmp.getHeight()) >> 2;  
    th.start();  
  }  
  public void draw() {  
    try {  
      canvas = sfh.lockCanvas();  
      if (canvas != null) {  
        canvas.drawColor(Color.WHITE);//       
        canvas.drawBitmap(bmp, bmp_x, bmp_y, paint);  
        paint.setTextSize(20);//         
        paint.setColor(Color.WHITE);  
        //                              
        canvas.drawRect(50, 30, 175,120, paint);  
        paint.setColor(Color.RED);//         
        if (v_str != null) {  
          for (int i = 0; i < v_str.size(); i++) {  
            canvas.drawText(v_str.elementAt(i), 50, 50 + i * 30,  
                paint);  
          }  
        }  
      }  
    } catch (Exception e) {  
      Log.v("Himi", "draw is Error!");  
    } finally {  
      sfh.unlockCanvasAndPost(canvas);  
    }  
  }  
  @Override 
  public void run() {  
    // TODO Auto-generated method stub  
    while (true) {  
      draw();  
      try {  
        Thread.sleep(100);  
      } catch (Exception ex) {  
      }  
    }  
  }  
  public void surfaceChanged(SurfaceHolder holder, int format, int width,  
      int height) {  
  }  
  public void surfaceDestroyed(SurfaceHolder holder) {  
  }  
  // @Override  
  // public boolean onTouchEvent(MotionEvent event) {//   2  
  // return true;  
  // }  
  @Override 
  public boolean onTouch(View v, MotionEvent event) {//   3  
    if (v_str != null)  
      v_str.removeAllElements();  
    return gd.onTouchEvent(event);//   4  
  }  
  // --------------     OnGestureListener            ---------  
  /** 
   * @          : 
   * @e1: 1   ACTION_DOWN MotionEvent       
   * @e2:    ACTION_UP MotionEvent      (       5   ) 
   * @velocityX:X       ,  /  
   * @velocityY:Y       ,  /  
   */ 
  @Override 
  public boolean onDown(MotionEvent e) {  
    // ACTION_DOWN  
    v_str.add("onDown");  
    return false;  
  }  
  @Override 
  // ACTION_DOWN 、       
  public void onShowPress(MotionEvent e) {  
    v_str.add("onShowPress");  
  }  
  @Override 
  // ACTION_DOWN 、       
  public void onLongPress(MotionEvent e) {  
    v_str.add("onLongPress");  
  }  
  @Override 
  // ACTION_DOWN 、     
  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
      float distanceY) {  
    v_str.add("onScroll");  
    return false;  
  }  
  @Override 
  // ACTION_DOWN 、   、 ACTION_UP  
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
      float velocityY) {  
    v_str.add("onFling");  
    //-------  5----------  
    // if(e1.getAction()==MotionEvent.ACTION_MOVE){  
    // v_str.add("onFling");  
    // }else if(e1.getAction()==MotionEvent.ACTION_DOWN){  
    // v_str.add("onFling");  
    // }else if(e1.getAction()==MotionEvent.ACTION_UP){  
    // v_str.add("onFling");  
    // }  
    // if(e2.getAction()==MotionEvent.ACTION_MOVE){  
    // v_str.add("onFling");  
    // }else if(e2.getAction()==MotionEvent.ACTION_DOWN){  
    // v_str.add("onFling");  
    // }else if(e2.getAction()==MotionEvent.ACTION_UP){  
    // v_str.add("onFling");  
    // }  
    if (isChagePage)  
      bmp = BitmapFactory.decodeResource(getResources(),  
          R.drawable.himi_dream);  
    else 
      bmp = BitmapFactory.decodeResource(getResources(),  
          R.drawable.himi_warm);  
    isChagePage = !isChagePage;  
    return false;  
  }  
  @Override 
  //   ACTION_DOWN、ACTION_UP  
  public boolean onSingleTapUp(MotionEvent e) {  
    v_str.add("onSingleTapUp");  
    return false;  
  }  
} 
       추가:코드 가 제스처 를 초기 화 할 때 다음 과 같은 말 이 있 습 니 다.gd.setIsLongpressEnabled(true);이 함수 표 지 는 true 를 설정 하면 긴 버튼 을 켜 는 것 입 니 다.장시간 터치 스크린 이 움 직 이지 않 으 면 onLongPress 제스처 를 얻 을 수 있 습 니 다.false 를 설정 하면 장시간 터치 스크린 이 움 직 이지 않 아 도 이 제스처 의 지원 을 받 을 수 없습니다.이 함 수 는 설정 하지 않 아 도 기본적으로 true 로 설정 합 니 다.
       비고 1:
       여기 서 저 는 이런 정의 Vector 방식 에 익숙 하지 않 은 어린이 신발 에 대해 간단하게 소개 하 겠 습 니 다.우 리 는 보통 용 기 를 정의 할 때 Vector vc=new Vector()를 직접 정의 합 니 다.네,맞습니다.하지만 이러한 Vector의 정 의 는 일반적인 정의 입 니 다.쉽게 말 하면 차이 점 이 있 습 니 다.만약 Vector vc=new Vector();이런 식 으로 Object 를 불 러 온 다음 에 꺼 낸 것 을 강하 게 돌려 야 하지 않 겠 습 니까?!하하,그리고 Vector이라는 정 의 는 이 용기 에 저 는 String 형식의 요소 만 담 고 있 음 을 나 타 냅 니 다.so~꺼 낼 때 도 더 이상 강하 게 돌리 지 않 아 도 됩 니 다.
       비고 2:
       테스트 를 통 해 터치 스크린 이벤트 에 응답 합 니 다.터치 스크린 초점 을 set Focusable InTouch Mode(false)로 설정 하 더 라 도 호출 됩 니 다!이 유 는 우리 의 이러한 view 가 터치 스크린 이벤트 모니터 에 연결 되 어 있 기 때 문 입 니 다.그러면 반드시 비고 3 에 응답 한 다음 에 우 리 는 비고 4 에 return true 가 없 는 것 이 아니 라 제스처 모니터 에 직접 돌려 서 감청 하 게 하고 모니터 에 적당 한 함 수 를 찾 아 사용자 의 제스처 를 처리 하 게 합 니 다.즉,표지 처리 가 완료 되 지 않 았 기 때문에 우리 가 다시 쓴 onTouch Event()도 계속 처리 할 것 입 니 다!
       비고 5:
       여기 서 설명 한 코드 는 두 동작 이 도대체 어느 두 동작 인지 테스트 하 는 것 입 니 다.왜냐하면 인터넷 에서 안 드 로 이 드 제스처 를 소개 하 는 댓 글 이 모두 미 친 전설 이기 때 문 입 니 다.
       첫 번 째 는 Motion Event.ACTION 입 니 다.DOWN,두 번 째 는 Motion Event.ACTIONMOVE。그러면 첫 번 째 동작 은 이 해 를 누 르 는 것 입 니 다.게이머 가 방금 터치 한 동작 입 니 다.두 번 째 동작 은 move 입 니 다!혹시 움 직 이 는 점 이 다 기록 되 어 있 나 요?
       사실 테스트 결과:
       첫 번 째 는 Motion Event.ACTION 입 니 다.DOWN,두 번 째 는 Motion Event.ACTIONUP!
       에이~지금 인터넷 에 올 라 오 는 댓 글 은 정말 여러 가지 베 끼 기 네요.테스트 해 보면 안 돼 요?답답 해!이 두 동작 중 하 나 는 누 르 고 하 나 는 들 어 올 리 는 것 이 므 로 그 의 미 를 명 확 히 할 수 있 습 니 다.우 리 는 이 두 동작 에 따라 사용자 가 도대체 미 끄 러 지 는 거리 등 을 알 수 있 습 니 다.그 거 리 는 e2.getX()-e1.getX()입 니 다.
       총결산
       1.터치 스크린 후 계속 터치 스크린 이 움 직 이지 않 고 변화 순서:on-Down->on ShowPress->on LongPress;
       2.화면 을 터치 한 후에 계속 화면 을 천천히 움 직 이 는 것 은 onScroll/빨리 움 직 이 는 것 은 onFling 이 고 손가락 이 화면 을 떠 나 는 것 입 니 다.
       주의:터치 스크린 후,계속 터치 스크린 으로 이동 합 니 다.만약 손가락 이 화면 을 떠 나 지 않 으 면,항상 onScroll 입 니 다.아무리 빨리 이동 하 더 라 도,영원히 onFling 이 아 닙 니 다!
       Ok,제스처 는 간단 하지만 능숙 하 게 사용 하고 게임 에 가입 하면 게임 을 더욱 빛나 게 할 것 입 니 다.
       이 실례 를 나 는 단지 손짓 으로 처리 했다.왜냐하면 다른 동작 은 모두 간단 하기 때문에 더 이상 말 하지 않 기 때문이다.
       추가 내용:
       인터넷 상에 서 제스처 에 관 한 많은 글 들 이 안 드 로 이 드 가 제스처 에 대한 지원 은 SDK 1.6(즉 API 4)에서 시작 되 었 다 고 말 하지만 나 는 SDK 1.5 시 뮬 레이 터 로 도 식별 할 수 있다!더 낮은 SDK 의 지원 효 과 를 테스트 하려 고 했 지만 SDK 가 1.5 버 전보 다 낮은 것 은 없 었 습 니 다).그래서 Api 를 찾 아 보 니:
          android.view.GestureDetector.OnGestureListener;    since api-1 ,
          android.view.GestureDetector;  since api-1 ,
       API 를 보면 api-1 부터 제스처 와 제스처 모니터 를 지원 해 왔 습 니 다.그러면 api-4 를 많이 해 야 이 말 을 지원 할 수 있 습 니 다!안 드 로 이 드 gesture 라 는 종 류 는 api-4 에서 지원 되 기 시 작 했 기 때문에 이런 입력 법 제스처 인식 에 사 용 될 것 입 니 다.
       결론:터치 스크린 제스처 인식 은 API-1 부터 지원 된다.입력 법 제스처 인식 은 API-4 가 지원 하기 시 작 했 습 니 다!여 긴 알 아야 돼!
       이상 은 안 드 로 이 드 에 대한 제스처 조작 전환 이미지 에 대한 자료 정리 입 니 다.추 후 관련 자 료 를 계속 보충 하 겠 습 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기