增加手势到手势库,我觉得这是触摸屏智能机最有用的一个功能之一,自己画一个手势保存下来,然后定义它执行的相应反应
Android使用GestureLibrary来代表手势库,并使用GestureLibraries工具类来创建手势库
- <!-- 使用手势绘制组件 -->
- <android.gesture.GestureOverlayView
- android:id="@+id/gesture"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:gestureStrokeType="multiple" />
- </LinearLayout>
这里可以设置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();
上面画了一个Z,并命名该手势为佐罗,保存
向AndroidManifest.xml添加SD卡的读写权限
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下面附上此例代码
main.xml
- <?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"
- android:gravity="center_horizontal"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="请在下面屏幕上绘制手势"/>
- <!-- 使用手势绘制组件 -->
- <android.gesture.GestureOverlayView
- android:id="@+id/gesture"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:gestureStrokeType="multiple" />
- </LinearLayout>
弹出的保存窗口save.xml
- <?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">
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="8dip"
- android:text="@string/gesture_name"
- />
- <!-- 定义一个文本框来让用户输入手势名 -->
- <EditText
- android:id="@+id/gesture_name"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- </LinearLayout>
- <!-- 定义一个图片框来显示手势 -->
- <ImageView
- android:id="@+id/show"
- android:layout_width="128dp"
- android:layout_height="128dp"
- android:layout_marginTop="10dp" />
- </LinearLayout>
- package WangLi.IO.AddGesture;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.gesture.Gesture;
- import android.gesture.GestureLibraries;
- import android.gesture.GestureLibrary;
- import android.gesture.GestureOverlayView;
- import android.gesture.GestureOverlayView.OnGesturePerformedListener;
- import android.graphics.Bitmap;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.EditText;
- import android.widget.ImageView;
- public class AddGesture extends Activity
- {
- EditText editText;
- GestureOverlayView gestureView;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 获取文本编辑框
- editText = (EditText) findViewById(R.id.gesture_name);
- // 获取手势编辑视图
- gestureView = (GestureOverlayView) findViewById(R.id.gesture);
- // 设置手势的绘制颜色
- gestureView.setGestureColor(Color.RED);
- // 设置手势的绘制宽度
- gestureView.setGestureStrokeWidth(4);
- // 为gesture的手势完成事件绑定事件监听器
- gestureView.addOnGesturePerformedListener(
- new OnGesturePerformedListener()
- {
- @Override
- public void onGesturePerformed(GestureOverlayView overlay,
- final Gesture gesture)
- {
- //加载save.xml界面布局代表的视图
- View saveDialog = getLayoutInflater().inflate(
- R.layout.save, null);
- // 获取saveDialog里的show组件
- ImageView imageView = (ImageView) saveDialog
- .findViewById(R.id.show);
- // 获取saveDialog里的gesture_name组件
- final EditText gestureName = (EditText) saveDialog
- .findViewById(R.id.gesture_name);
- // 根据Gesture包含的手势创建一个位图
- Bitmap bitmap = gesture.toBitmap(128, 128, 10, 0xFFFF0000);
- imageView.setImageBitmap(bitmap);
- //使用对话框显示saveDialog组件
- new AlertDialog.Builder(AddGesture.this)
- .setView(saveDialog)
- .setPositiveButton("保存", new OnClickListener()
- {
- @Override
- public void onClick(DialogInterface dialog,
- int which)
- {
- // 获取指定文件对应的手势库
- GestureLibrary gestureLib = GestureLibraries
- .fromFile("/sdcard/mygestures");
- // 添加手势
- gestureLib.addGesture(gestureName.getText().toString(),
- gesture);
- // 保存手势库
- gestureLib.save();
- }
- })
- .setNegativeButton("取消", null)
- .show();
- }
- });
- }
- }