初学Android,增加手势到手势库(五十)

http://blog.csdn.net/lee576/article/details/7991563

增加手势到手势库,我觉得这是触摸屏智能机最有用的一个功能之一,自己画一个手势保存下来,然后定义它执行的相应反应

Android使用GestureLibrary来代表手势库,并使用GestureLibraries工具类来创建手势库

[html]  view plain copy print ?
  1. <!-- 使用手势绘制组件 -->  
  2. <android.gesture.GestureOverlayView  
  3.     android:id="@+id/gesture"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:gestureStrokeType="multiple" />  
  7. </LinearLayout>  
xml里面写了一个属性android:gestureStrokeType="multiple"
这里可以设置single和multiple
如果你只需要识别一笔,那么single就可以了,如果不确定,那么设置成multiple
"二",就需要两笔才能画出
gesture.getStrokesCount()能得到手势的笔数
(ps:ArrayList<GestureStroke> gestureStrokeList = gesture.getStrokes();也能得到每一笔的信息)
用户画好了手势,如何保存呢
很不幸,手势不是保存到数据库中的,也不能直接保存到数据库中,它是以文件的形式存在的

GestureLibrary gestureLibrary;
Library,是的,文件是一个手势库,也就是说,一个文件对应多个手势


获得这个Library
gestureLibrary = GestureLibraries.fromFile(path);


然后保存到这个Library
gestureLibrary.addGesture(mName, mGesture);
gestureLibrary.save();

初学Android,增加手势到手势库(五十)_第1张图片

上面画了一个Z,并命名该手势为佐罗,保存

向AndroidManifest.xml添加SD卡的读写权限

[html]  view plain copy print ?
  1. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  

下面附上此例代码

main.xml

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:gravity="center_horizontal"  
  7.     >  
  8. <TextView  
  9.     android:layout_width="fill_parent"  
  10.     android:layout_height="wrap_content"  
  11.     android:text="请在下面屏幕上绘制手势"/>  
  12. <!-- 使用手势绘制组件 -->  
  13. <android.gesture.GestureOverlayView  
  14.     android:id="@+id/gesture"  
  15.     android:layout_width="fill_parent"  
  16.     android:layout_height="fill_parent"  
  17.     android:gestureStrokeType="multiple" />  
  18. </LinearLayout>  

弹出的保存窗口save.xml

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent">  
  6. <LinearLayout  
  7.     android:orientation="horizontal"  
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="wrap_content">  
  10. <TextView  
  11.     android:layout_width="wrap_content"  
  12.     android:layout_height="wrap_content"  
  13.     android:layout_marginRight="8dip"  
  14.     android:text="@string/gesture_name"  
  15.      />  
  16. <!-- 定义一个文本框来让用户输入手势名 -->    
  17. <EditText  
  18.     android:id="@+id/gesture_name"  
  19.     android:layout_width="fill_parent"  
  20.     android:layout_height="wrap_content"/>     
  21. </LinearLayout>  
  22. <!-- 定义一个图片框来显示手势 -->    
  23. <ImageView  
  24.     android:id="@+id/show"  
  25.     android:layout_width="128dp"  
  26.     android:layout_height="128dp"  
  27.     android:layout_marginTop="10dp" />  
  28. </LinearLayout>  


主界面代码

[java]  view plain copy print ?
  1. package WangLi.IO.AddGesture;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.AlertDialog;  
  5. import android.content.DialogInterface;  
  6. import android.content.DialogInterface.OnClickListener;  
  7. import android.gesture.Gesture;  
  8. import android.gesture.GestureLibraries;  
  9. import android.gesture.GestureLibrary;  
  10. import android.gesture.GestureOverlayView;  
  11. import android.gesture.GestureOverlayView.OnGesturePerformedListener;  
  12. import android.graphics.Bitmap;  
  13. import android.graphics.Color;  
  14. import android.os.Bundle;  
  15. import android.view.View;  
  16. import android.widget.EditText;  
  17. import android.widget.ImageView;  
  18.   
  19. public class AddGesture extends Activity  
  20. {  
  21.     EditText editText;  
  22.     GestureOverlayView gestureView;  
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState)  
  25.     {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.main);  
  28.         // 获取文本编辑框  
  29.         editText = (EditText) findViewById(R.id.gesture_name);  
  30.         // 获取手势编辑视图  
  31.         gestureView = (GestureOverlayView) findViewById(R.id.gesture);  
  32.         // 设置手势的绘制颜色  
  33.         gestureView.setGestureColor(Color.RED);  
  34.         // 设置手势的绘制宽度  
  35.         gestureView.setGestureStrokeWidth(4);  
  36.         // 为gesture的手势完成事件绑定事件监听器  
  37.         gestureView.addOnGesturePerformedListener(  
  38.             new OnGesturePerformedListener()  
  39.             {  
  40.                 @Override  
  41.                 public void onGesturePerformed(GestureOverlayView overlay,  
  42.                     final Gesture gesture)  
  43.                 {  
  44.                     //加载save.xml界面布局代表的视图  
  45.                     View saveDialog = getLayoutInflater().inflate(  
  46.                         R.layout.save, null);  
  47.                     // 获取saveDialog里的show组件  
  48.                     ImageView imageView = (ImageView) saveDialog  
  49.                         .findViewById(R.id.show);  
  50.                     // 获取saveDialog里的gesture_name组件  
  51.                     final EditText gestureName = (EditText) saveDialog  
  52.                         .findViewById(R.id.gesture_name);  
  53.                     // 根据Gesture包含的手势创建一个位图  
  54.                     Bitmap bitmap = gesture.toBitmap(128128100xFFFF0000);  
  55.                     imageView.setImageBitmap(bitmap);  
  56.                     //使用对话框显示saveDialog组件  
  57.                     new AlertDialog.Builder(AddGesture.this)  
  58.                         .setView(saveDialog)  
  59.                         .setPositiveButton("保存"new OnClickListener()  
  60.                         {  
  61.                             @Override  
  62.                             public void onClick(DialogInterface dialog,  
  63.                                 int which)  
  64.                             {  
  65.                                 // 获取指定文件对应的手势库  
  66.                                 GestureLibrary gestureLib = GestureLibraries  
  67.                                     .fromFile("/sdcard/mygestures");  
  68.                                 // 添加手势  
  69.                                 gestureLib.addGesture(gestureName.getText().toString(),  
  70.                                     gesture);  
  71.                                 // 保存手势库  
  72.                                 gestureLib.save();  
  73.                             }  
  74.                         })  
  75.                         .setNegativeButton("取消"null)  
  76.                         .show();  
  77.                     }  
  78.             });  
  79.     }  
  80. }  

你可能感兴趣的:(初学Android,增加手势到手势库(五十))