안 드 로 이 드 게임 개발 사용자 정의 제스처-입력 법 제스처 기술
17373 단어 Android사용자 정의 제스처
1、Android SDK 는 아래 호 환 에 속 합 니 다!그러면 낮은 버 전 으로 실행 할 수 있 습 니 다.높 은 버 전 은 기본적으로 문제 가 없습니다!(물론 매번 SDK 의 업데이트 가 새로운 기능 을 가 져 오 거나 원래 의 BUG 등 을 수정 했다 면 게임 개발 에 있어 서 더 높 은 SDK 버 전의 지원 이 필요 하지 않 은 상황 에서 최신 SDK 를 추구 할 필요 가 전혀 없다!)
2.낮은 버 전 으로 게임 개발 을 하면 더 많은 기종 을 고려 하여 더 많은 사용 자 를 얻 을 수 있 습 니 다!
3.안 드 로 이 드 SDK 의 매번 버 전의 업데이트,바 텀 코드 도 더욱 건장 하고 최적화 될 것 이라는 것 을 잘 알 고 있 습 니 다!예 를 들 어 우리 회사 의 온라인 게임 안 드 로 이 드 버 전 은 G2(SDK 1.5)에서 뛰 기 에는 약간 카드 가 있 지만 내 핸드폰(SDK 2.2)에 서 는 원활 하 게 작 동 되 고 있 습 니 다.여러 가지 편안 함 이 있 습 니 다~하지만 이렇게 하면 우리 자신의 게임 이 올 라 오 면 높 은 버 전의 SDK 로 개발 하 는 등 단점 도 가 져 올 수 있 습 니 다.그러면 성능,메모리 에 대해 서 는 어 떻 습 니까?우 리 는 그 효 과 를 쉽게 알 아 보지 못 할 것 입 니 다.만약 우리 가 낮은 버 전의 SDK 를 사용한다 면 성능 이 어떤 지 뚜렷하게 느 낄 수 있 을 것 입 니 다.만약 당신 의 게임 이 1.5,1.6 에서 유창 하 게 달린다 면 더 높 은 버 전의 SDK 기계 에 두 는 것 은 더 말 할 나 위도 없습니다.
요약:게임 개발 에 있어 서 게임 이 더 높 은 API 지원 이 필요 하지 않다 면 SDK 1.5 와 1.6 을 기반 으로 개발 하 는 것 을 추천 합 니 다!
지난 편 에서 저 는 터치 스크린 제스처 조작 을 소 개 했 지만 이런 터치 스크린 제스처 의 조작 은 한계 가 있 습 니 다.예 를 들 어 우 리 는 안 드 로 이 드 가 제스처 를 이용 하여 자 물 쇠 를 풀 수 있다 는 것 을 알 고 있다.예 를 들 어 우 리 는 안 드 로 이 드 가 구 궁 격 형식 과 비슷 하 다.사용자 정의 한 단일 필획 제스처 를 통 해 스크린 자 물 쇠 를 풀 수 있 고 필획 제스처 를 사용자 정의 하여 응용 프로그램 을 시작 할 수 있다 는 것 을 알 고 있다.그러면 이런 이른바 필획 제스처 는 바로 오늘 제 가 설명 하고 자 하 는 입력 법 제스처 인식 기술 입 니 다!이런 제스처 는 우리 가 스스로 사용자 정의 할 수 있 는 것 이지,이전의 터치 제스처 동작 이 아니 라,단지 안 드 로 이 드 를 이용 하여 터치 동작 에 대한 봉인 일 뿐이다.아래 의 핸드폰 사용자 정의 필획 제스처 잠 금 해제 캡 처:
OK.그러면 제스처 로 잠 금 해제 등 을 할 수 있 으 니 게임 개발 에 있어 서 이 하 이 라 이 트 를 추가 할 수 있 습 니 다.예 를 들 어 게임 에서 제 가 원형 을 그 려 서 배경 조작 을 하고 X 를 그 려 서 게임 에서 탈퇴 하 는 등 하하 재 미 있 지 않 습 니까?자,다음은 설명 을 시작 하 겠 습 니 다!
먼저 본 편 은 주로 두 가 지 를 배운다.
1.입력 법 제스처 를 만 들 고 입력 법 제스처 를 삭제 하 며 SD 카드 에서 제스처 파일 을 읽 습 니 다!
2.입력 법 제스처 가 생 성 되면 사용자 정의 제스처 와 일치 하 는 방법!
다음은 두 가지 유형 과 몇 가지 개념 을 숙지 하 겠 습 니 다.
1.Gesture Overlay View 는 무엇 입 니까? 쉽게 말 하면 사실은 손 으로 그림 을 그 리 는 구역 이다.
2.Gesture Library 가 무엇 입 니까? 이 종 류 는 제스처 를 저장,삭제 등 작업 을 하 는 제스처 를 저장 하 는 작은 창고 입 니 다!
3.필획 은 무엇 입 니까?필획 은 무엇 입 니까? 네,사실은 우리 가 쓴 필획 과 하나의 개념 입 니 다!
4.필획 유형 은 무엇 입 니까? 입력 법 제스처 작업 중 필획 유형 은 두 가지 가 있 습 니 다.하 나 는 한 획,다른 하 나 는 다 획 이다.
단일 필획 이란 한 획 에 제스처 를 그 리 는 것 이다.손가락 이 화면 에 닿 을 때 부터 화면 을 떠 날 때 까지 필획 은 바로 제스처 를 이룬다!단숨에!
그리고 다 필획 은 일정한 시간 안에 마음대로 몇 획 을 그 어도 된다.그리고 이 빡빡 한 시간 을 초과 하면 제스처 가 된다!
먼저 항목 캡 처 를 하고 그 기능 과 조작 을 간단하게 말 합 니 다.
그림 1 화면 에서 3 조각 으로 나 뉘 는데 위 에서 아래로 다음 과 같다.TextView,EditText,Surface View;그리고 Surface View 뒤에 전체 화면 을 덮 는 Gesture Overlay View 가 있 습 니 다!
그림 2 화면 은 만들어 진 제스처 에서 제스처 와 일치 하 는 화면 입 니 다.여기 서 잘 보 입 니 다.잘 찾 았 습 니 다~헤헤~
main.xml 먼저 보기:
XML/HTML 코드
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/himi_tv" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello"
android:textSize="15sp" android:textColor="#FFFFFF00" />
<EditText android:id="@+id/himi_edit" android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_weight="1">
<com.himi.MySurfaceView android:id="@+id/view3d"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
<android.gesture.GestureOverlayView
android:id="@+id/himi_gesture" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_weight="1.0"/>
</RelativeLayout>
</LinearLayout>
xml 에 등 록 된 사용자 정의 surfaceview 는 익숙 하지 않 습 니 다.안 드 로 이 드 게임 개발 6 을 보 러 가 셔 도 됩 니 다.설명 이 많 지 않 습 니 다.Gesture OverlayView 에 대해 서도 간단하게 너비 와 높이 를 정 의 했 을 뿐 코드 에 설정 한 중요 한 속성 도 있 습 니 다.물론 xml 도 설정 할 수 있 습 니 다.다음은 MainActivity.java:
자바 코드
/**
*@author Himi
*@
*@ : android.gesture api-4(SDK1.6) !
*@ : SD , AndroidMainfest.xml SD !
*/
public class MainActivity extends Activity {
private GestureOverlayView gov;//
private Gesture gesture;//
private GestureLibrary gestureLib;//
private TextView tv;
private EditText et;
private String path;//
private File file;//
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.himi_tv);
et = (EditText) findViewById(R.id.himi_edit);
gov = (GestureOverlayView) findViewById(R.id.himi_gesture);
gov.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);//
// GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE
// GestureOverlayView.GESTURE_STROKE_TYPE_SINGLE
path = new File(Environment.getExternalStorageDirectory(), "gestures").getAbsolutePath();
// /sdcard/gestures
file = new File(path);// gestures
gestureLib = GestureLibraries.fromFile(path);//
gov.addOnGestureListener(new OnGestureListener() { //
@Override
//
public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
tv.setText(" ! ~");
}
@Override
//
public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
gesture = overlay.getGesture();//
if (gesture.getStrokesCount() == 2) {//
//( : , 1!)
if (event.getAction() == MotionEvent.ACTION_UP) {//
//if(gesture.getLength()==100){}// 100
if (et.getText().toString().equals("")) {
tv.setText(" ,so~ ~");
} else {
tv.setText(" ...");
addGesture(et.getText().toString(), gesture);//
}
}
} else {
tv.setText(" ! ~");
}
}
@Override
public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
}
@Override
public void onGesture(GestureOverlayView overlay, MotionEvent event) {
}
});
//---- !------
if (!gestureLib.load()) {
tv.setText("Himi : 9 , !"
+ " ~(*^__^*)~ !/n :( ~)/n1." +
" : EditText , !/n2. :"
+ " EditText /"himi/", ! ");
} else {
Set<String> set = gestureLib.getGestureEntries();//
Object ob[] = set.toArray();
loadAllGesture(set, ob);
}
}
}
이것 이 바로 MainActivity 의 주요 코드 입 니 다.그 중에서 제스처 를 추가 하고 제스처 와 일치 하 며 제스처 를 옮 겨 다 니 며 제스처 를 그림 으로 바 꾸 는 것 입 니 다.이런 것들 은 제 가 따로 함수 로 써 서 여러분 의 어린이 신발 에 더욱 뚜렷 한 방향 을 제시 합 니 다.상기 코드 에서 우 리 는 제스처 를 만 들 기 전에 손 으로 그림 그리 기 구역(Gesture Overlay View)이 먼저 만들어 진 것 을 알 수 있 습 니 다.그 다음 에 우 리 는 그 구역 에서 그림 그리 기 제스처 를 할 수 있 습 니 다.물론 그림 을 그리 기 전에 우 리 는 필획 유형 을 설정 해 야 합 니 다.이것 은 제 가 처음에 소개 한 것 입 니 다.그 다음 에 가장 중요 한 것 은 바로 손 으로 그림 을 그 리 는 구역 의 제스처 모니터 바 인 딩 입 니 다.OnGesture Listener 라 는 모니터 를 추가 하여 네 개의 함 수 를 다시 썼 습 니 다.여기 서 가장 중요 한 것 은 두 개의 함수 입 니 다.
onGestureStarted 화해시키다 onGestureEnded :제스처 시작 과 제스처 가 끝 난 감청 함수.
특히 손짓 으로 감청 을 끝 내 는 함수 가 특히 중요 합 니 다.그 중에서 저 는 몇 가지 조건 문 구 를 설 치 했 습 니 다.이런 몇 가지 조건 은 한편 으로 는 Gesture 에서 비교적 중요 하고 자주 사용 하 는 방법 을 알려 드 리 는 것 입 니 다.다른 한편 으로 는 제 가 여러분 에 게 어린이 신발 을 알려 드 리 겠 습 니 다.
만약 에 필획 유형 이 다 중 필획 유형 이 라 고 설정 하면 이상 적 인 상태 에서 타 이 트 한 시간 안에 제스처 를 그 리 는 것 이 어야 합 니 다.몇 필획 을 사용 하 든 시스템 은 일정 시간 동안 필획 을 하지 않 았 다 고 판단 할 때 제스처 를 만 들 고 시스템 이 이 함수 에 응답 해 야 합 니 다.
사실은 틀 렸 습 니 다.처음에 저도 그렇게 생각 했 습 니 다.하지만 당신 이 설정 한 필획 유형 이 단일 하 든 다 중 필획 이 든 손가락 이 화면 을 떠 날 때 안 드 로 이 드 는 현재 몇 번 째 펜 이 든 이 완성 함수 에 응답 할 것 입 니 다.so~저 는 여기 서 제스처 Gesture 류 의 getStrokes Count()함 수 를 호출 합 니 다.이 함 수 는 타 이 트 한 시간 안에 제스처 의 획 수 를 기록 할 것 입 니 다.그러면 이 함수 에 따라 우 리 는 손가락 이 화면 을 떠 나 면 항상 응답 하 는 문 제 를 해결 할 수 있 습 니 다.단일 획 유형 은 영원히 이 값 이 1 보다 크 지 않 기 때 문 입 니 다!
그리고 if(event.getAction()=MotionEvent.ACTIONUP){}이 걸 쓰 면 두 번 째 인자 버튼 동작 을 보 여 주 는 것 뿐 입 니 다.
그러면 제스처 를 만 드 는 방법 을 살 펴 보 겠 습 니 다.
자바 코드
public void addMyGesture(String name, Gesture gesture) {
try {
if (name.equals("himi")) {
findGesture(gesture);
} else {
// SDcard 【Android2D 】
if (Environment.getExternalStorageState() != null) {// sdcard!
if (!file.exists()) {//
//
gestureLib.addGesture(name, gesture);
if (gestureLib.save()) {////
gov.clear(true);//
// /sdcard/gesture ,so~ AndroidMainfest.xml !
// , 、 , ,
// , AndroidMainfest.xml , .. !
tv.setText(" ! ," + " " +
" ! .");
et.setText("");
gestureToImage(gesture);
} else {
tv.setText(" !");
}
} else {//
// ,
if (!gestureLib.load()) {//
tv.setText(" !");
} else {//
Set<String> set = gestureLib.getGestureEntries();//
Object ob[] = set.toArray();
boolean isHavedGesture = false;
for (int i = 0; i < ob.length; i++) {// name
if (((String) ob[i]).equals(name)) {// name
isHavedGesture = true;
}
}
if (isHavedGesture) {// true name
//---- 1-------------------//gestureLib.removeGesture(name, gesture);//
/*---- 2-----------------*/gestureLib.removeEntry(name);
gestureLib.addGesture(name, gesture);
} else {
gestureLib.addGesture(name, gesture);
}
if (gestureLib.save()) {
gov.clear(true);//
gestureToImage(gesture);
tv.setText(" ! :" + ob.length + " ");
et.setText("");
} else {
tv.setText(" !");
}
////------- -- 9 --------
if (ob.length > 9) {
for (int i = 0; i < ob.length; i++) {//
gestureLib.removeEntry((String) ob[i]);
}
gestureLib.save();
if (MySurfaceView.vec_bmp != null) {
MySurfaceView.vec_bmp.removeAllElements();//
}
tv.setText(" 9 , !");
et.setText("");
}
ob = null;
set = null;
}
}
} else {
tv.setText(" SD - -。");
}
}
} catch (Exception e) {
tv.setText(" !");
}
}
여기 서도 이해 하기 쉽다.플러그 인 은 이전에 File 파일 에 저 장 된 플러그 인 과 유사 하 다.먼저 SD 가 존재 하 는 지,그 다음 에 파일 이 존재 하 는 지 판단 한다.파일 이 존재 하지 않 으 면 제스처 창고 에 직접 추가 한 다음 제스처 창 고 는 gesture Lib.save()를 호출 해 야 SD 카드 의 제스처 파일 에 제스처 를 저장 할 수 있 습 니 다.
파일 이 존재 하면 파일 에 같은 이름 의 제스처 가 포함 되 어 있 는 지 확인 해 야 합 니 다.물론 같은 제스처 이름 이 있 는 지 여 부 를 판정 하지 않 고 삭제 작업 을 할 수 있 습 니 다!사실 삭제 하지 않 고 현재 새로 만 든 제스처 를 직접 추가 할 수 있 습 니 다.원인 은 아래 의 비고 설명 을 보면 알 수 있다.
비고 1:gestureLib 에 저 장 된 제스처 는 HashMap,key=제스처 의 이름,value=제스처 이기 때문에 gestureLib.removeGesture(name,gesture);이러한 삭제 방식 은 제스처 만 삭 제 했 을 뿐 이 제스처 이름 은 hashmap 에 저 장 됩 니 다.다음 에 같은 name 제스처 가 저장 되 었 을 때 Hashmap 은 이 항목 을 직접 덮어 씁 니 다.따라서 Hashmap 의 특징 에 따라 삭제 작업 을 하지 않 고 gesture Lib.addGesture(name,gesture)를 직접 할 수 있 습 니 다.같은 제스처 이름 의 제스처 가 나 오 면 Hashmap 은 key(제스처 이름)에 따라 항목 의 value(제스처)를 직접 덮어 쓰기 때 문 입 니 다.
비고 2:여기 도 제스처 를 삭제 하 는 방식 입 니 다.그러나 이 방식 은 비고 1 과 달리 Hashmap 의 항목 을 삭제 합 니 다.즉,key 와 value 가 모두 삭제 되 었 습 니 다!
제스처 를 비트 맵 으로 바 꾸 는 방법 을 살 펴 보 겠 습 니 다.
자바 코드
public void gestureToImage(Gesture ges) {// Bitmap
// , SurfaceView Image , ~
if (MySurfaceView.vec_bmp != null) {
MySurfaceView.vec_bmp.addElement(ges.toBitmap(100, 100, 12, Color.GREEN));
}
}
다음은 어떻게 제스처 를 옮 겨 다 니 는 지:자바 코드
public void loadAllGesture(Set<String> set, Object ob[]) { //
if (gestureLib.load()) {//
set = gestureLib.getGestureEntries();//
ob = set.toArray();
for (int i = 0; i < ob.length; i++) {
// Bitmap
gestureToImage(gestureLib.getGestures((String) ob[i]).get(0));
//
MySurfaceView.vec_string.addElement((String) ob[i]);
}
}
}
다음은 마지막 으로 제스처 의 매 칭 을 살 펴 보 겠 습 니 다.자바 코드
public void findGesture(Gesture gesture) {
try {
// SDcard 【Android2D 】
if (Environment.getExternalStorageState() != null) {// sdcard!
if (!file.exists()) {//
tv.setText(" , !!");
} else {//
// ,
if (!gestureLib.load()) {//
tv.setText(" , !");
} else {//
List<Prediction> predictions = gestureLib.recognize(gesture);
//recognize() prediction ,
// gesture 。
// , ,
if (!predictions.isEmpty()) {
Prediction prediction = predictions.get(0);
//prediction score
//prediction name
//prediction score gesture ( score 1 )。
if (prediction.score >= 1) {
tv.setText(" :name =" + prediction.name);
}
}
}
}
} else {
tv.setText(" ,, SD - -。");
}
} catch (Exception e) {
e.printStackTrace();
tv.setText(" , ~");
}
}
그러면 마지막 으로 여러분 께 말씀 드 리 겠 습 니 다.사실 입력 법 제스처 조작 은 게임 에서 사용 하기에 매우 적합 합 니 다.터치 스크린 제스처 조작 이 든 오늘 말 한 입력 법 제스처 조작 이 든 게임 에 넣 으 면 아주 좋 습 니 다!이상 은 안 드 로 이 드 사용자 정의 제스처 의 실현 예 입 니 다.추 후 관련 자 료 를 계속 정리 하 겠 습 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.