安卓手势识别开发浅谈

maimu 2014-07-29

手势识别在安卓开发里虽然用到的场景不是很多,但有时候还是能让你的产品更方便,更有趣味。比如登陆时不用每次重复输入密码,只需九宫格手势解锁,就像支付宝客户端那样。下面我们完成一个简单的手势识别开发。

我们首先需要一个描述手势动作的文件,在模拟器里预装一个叫GesturesBuilder的程序,这个程序就是让你创建自己的手势的(GesturesBuilder的源代码在sdk问samples里面有,有兴趣可以看看)。创建的手势将被保存到/sdcard/gestures里面。

建立好自己的手势库后,我们就可以实现手势识别了,新建一个工程,把上面的手势库文件复制到你的工程/res/raw下,你就可以在你的工程里面使用这些手势了。复制到/res/raw下的手势是只读的,也就是说你不能修改或增加手势了。

布局xml文件大概如下:

<android.gesture.GestureOverlayView
	    android:id="@+id/gestures"
	    android:layout_width="fill_parent"
	    android:layout_height="0dp"
	    android:layout_weight="1"
	    android:gestureStrokeType="multiple"
	    />
	<Button
	android:layout_weight="0"
	 android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/recognize"
    android:onClick="find"
    />

MainActivity里主要代码:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        library = GestureLibraries.fromRawResource(this, R.raw.gestures);
        library.load();
        
        overlayView = (GestureOverlayView) this.findViewById(R.id.gestures);
        //只针对单笔手势:overlayView.addOnGesturePerformedListener(new GesturePerformedListener());
        overlayView.addOnGestureListener(new GestureListener());
    }
    
    public void find(View v){
    	recognize(mgesture);
    	overlayView.clear(true);
    }
    
    private final class GestureListener implements OnGestureListener{
		public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
			
		}
		public void onGesture(GestureOverlayView overlay, MotionEvent event) {
			
		}
		public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
			mgesture = overlay.getGesture();
		}
		public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
		}
    }
    
    private final class GesturePerformedListener implements OnGesturePerformedListener{
		public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
			recognize(gesture);
		}		
    }
    
    private void recognize(Gesture gesture) {
		ArrayList<Prediction> predictions = library.recognize(gesture);
		if(!predictions.isEmpty()){
			Prediction prediction = predictions.get(0);
                        //6表示60%相似
			if(prediction.score >= 6){
                          //call和close是我们在建立手势库时给手势取得名字
				if("call".equals(prediction.name)){
					Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:1350505050"));
					startActivity(intent);
				}else if("close".equals(prediction.name)){
					finish();//关闭Activity
				}
			}else{
				Toast.makeText(getApplicationContext(), R.string.low, 1).show();
			}
		}else{
			Toast.makeText(getApplicationContext(), R.string.notfind, 1).show();
		}
	}
    
	@Override
	protected void onDestroy() {
		super.onDestroy();
		android.os.Process.killProcess(android.os.Process.myPid());//关闭应用
	}

大家看得出来,我这里定义了两个手势动作,当手势形如手势库中call时,就拨打电话,当手势形如手势库中close时,就退出程序。ok,手势识别开发就这么简单,我们可以再这基础之上做一些复杂的,比如实现手势解锁。思想很简单,我们可以修改下GesturesBuilder的源代码放入自己的工程,用户自己定义好手势动作后将其保存在手势库中,这样用户就可以用手势验证了。

相关推荐