Android 게임 개발:제스처 동작 으로 그림 을 전환 하 는 인 스 턴 스 구현
제스처 인식 개술
제스처 조작 이란 댄스 머 신,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
비고 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 가 지원 하기 시 작 했 습 니 다!여 긴 알 아야 돼!
이상 은 안 드 로 이 드 에 대한 제스처 조작 전환 이미지 에 대한 자료 정리 입 니 다.추 후 관련 자 료 를 계속 보충 하 겠 습 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.