Android 사용자 정의 제스처-입력 법 제스처 기술

소프트웨어 개발 을 진행 할 때,일반적으로 우 리 는 비교적 새로운 버 전의 도 구 를 사용 하 는 것 을 좋아 하지만,여기 서 나 는 왜 낮은 버 전의 SDK 를 사용 하여 안 드 로 이 드 게임 을 개발 합 니까?이 유 를 소개 하 겠 습 니 다.
       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("      ,       ~");  
  }  
} 
       그러면 마지막 으로 여러분 께 말씀 드 리 겠 습 니 다.사실 입력 법 제스처 조작 은 게임 에서 사용 하기에 매우 적합 합 니 다.터치 스크린 제스처 조작 이 든 오늘 말 한 입력 법 제스처 조작 이 든 게임 에 넣 으 면 아주 좋 습 니 다!
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기