初学Android,增加手势到手势库(五十)
16lz
2021-01-23
增加手势到手势库,我觉得这是触摸屏智能机最有用的一个功能之一,自己画一个手势保存下来,然后定义它执行的相应反应
Android使用GestureLibrary来代表手势库,并使用GestureLibraries工具类来创建手势库
[html] view plain copy print ?- <!--使用手势绘制组件-->
- <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卡的读写权限
[html] view plain copy print ?- <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下面附上此例代码
main.xml
[html] view plain copy print ?- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns: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 [html] view plain copy print ?
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns: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>
- packageWangLi.IO.AddGesture;
- importandroid.app.Activity;
- importandroid.app.AlertDialog;
- importandroid.content.DialogInterface;
- importandroid.content.DialogInterface.OnClickListener;
- importandroid.gesture.Gesture;
- importandroid.gesture.GestureLibraries;
- importandroid.gesture.GestureLibrary;
- importandroid.gesture.GestureOverlayView;
- importandroid.gesture.GestureOverlayView.OnGesturePerformedListener;
- importandroid.graphics.Bitmap;
- importandroid.graphics.Color;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.widget.EditText;
- importandroid.widget.ImageView;
- publicclassAddGestureextendsActivity
- {
- EditTexteditText;
- GestureOverlayViewgestureView;
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- 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(
- newOnGesturePerformedListener()
- {
- @Override
- publicvoidonGesturePerformed(GestureOverlayViewoverlay,
- finalGesturegesture)
- {
- //加载save.xml界面布局代表的视图
- ViewsaveDialog=getLayoutInflater().inflate(
- R.layout.save,null);
- //获取saveDialog里的show组件
- ImageViewimageView=(ImageView)saveDialog
- .findViewById(R.id.show);
- //获取saveDialog里的gesture_name组件
- finalEditTextgestureName=(EditText)saveDialog
- .findViewById(R.id.gesture_name);
- //根据Gesture包含的手势创建一个位图
- Bitmapbitmap=gesture.toBitmap(128,128,10,0xFFFF0000);
- imageView.setImageBitmap(bitmap);
- //使用对话框显示saveDialog组件
- newAlertDialog.Builder(AddGesture.this)
- .setView(saveDialog)
- .setPositiveButton("保存",newOnClickListener()
- {
- @Override
- publicvoidonClick(DialogInterfacedialog,
- intwhich)
- {
- //获取指定文件对应的手势库
- GestureLibrarygestureLib=GestureLibraries
- .fromFile("/sdcard/mygestures");
- //添加手势
- gestureLib.addGesture(gestureName.getText().toString(),
- gesture);
- //保存手势库
- gestureLib.save();
- }
- })
- .setNegativeButton("取消",null)
- .show();
- }
- });
- }
- }
更多相关文章
- Android 根文件系统启动过程(init进程 详细分析)
- 批量反编译Android XML文件Python脚本
- android文件管理实现源码
- Android 最简单的SD卡文件遍历程序
- “AndroidManifest.xml 系统找不到指定的文件”解决方案
- Android资源文件mk的格式
- Android封装的HTTP请求组件