首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》手势输入

关灯直达底部

在触摸屏世界中,使用复杂的手势(如在屏幕上不同方向多点触摸)是使交互简单有趣的非常好的方式。从Android 1.6(API level 4)开始提供手势API。在该API中,最简单的方式是使用android.gesture.GestureOverlayView给应用添加手势输入功能:


<!-- an example usage of GestureOverlayView in a layout xml --><android.gesture.GestureOverlayView        xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/gestures"    android:layout_    android:layout_    android:gestureStrokeType="multiple"    android:eventsInterceptionEnabled="true"></<android.gesture.GestureOverlayView>  

GestureOverlayView是一个专门的FrameLayout,你可以在该视图上放置其他widget,或者包含其他widget。它可以捕捉触摸屏的笔画并使用有颜色的线条(默认是黄色)来显示笔画。GestureOverlayView.OnGesturePerformedListener接口用来支持对手势做出响应:


GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);gestures.addOnGesturePerformedListener(                            new GestureOverlayView.OnGesturePerformedListener {    @Override    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {        // do nothing for now    }});  

一旦给出某个手势,则可以查看Gesture库看能否识别该手势。Gesture库可以使用GestureLibraries类的静态方法,通过各种方式读取。加载Gesture库(加载GestureStore)之后,可以给其传递手势,并使用recognize方法分析它。该方法会返回Predictions列表,每个Prediction包含一个打分和名称,打分表示和库内该名称的手势的接近程度:


final GestureLibrary library = GestureLibraries.fromFile("/Some/File/Path");library.load;         // load libraryGestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);gestures.addOnGesturePerformedListener(                            new GestureOverlayView.OnGesturePerformedListener {    @Override    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {            // do the recognize        ArrayList<Prediction> predictions = library.recognize(gesture);        if (predictions.size > 0) {            for(Prediction prediction: predictions) {                // the score is high enough that we know it's a hit                if (prediction.score > 1.0) {                    // let's show a toast telling us what the gesture is named                    Toast.makeText(this,                      prediction.name, Toast.LENGTH_SHORT).show;                }            }        }    }});  

Gesture类的基础结构中包含多个GestureStroke对象,每个GestureStroke对象由一组GesturePoint对象组成。GesturePoint由(x,y)坐标以及生成该坐标点的时间戳组成。当在GestureStore(在GestureLibrary库内)中保存Gesture时,把名称(string)作为密钥。

在GestureLibrary中增加一个Gesture是非常简单的。提供和该手势关联的名称和Gesture对象,然后把它保存到GestureLibrary中。注意,库必须是从外部文件源中读取的(如SD卡或私有文件),这样库才是可修改并可存储的。从原始资源中读取的库是只读的(使用GestureLibraries.fromRawResource(context,resId)):


public void saveGesture(String name, Gesture gesture) {    library.addGesture(name, gesture);    library.save;}