1. 先完成自定义手势的Activity
1.1 因为需要存储手势文件所以需要声明权限:
<uses-permission androID:name="androID.permission.READ_EXTERNAL_STORAGE" /> //读取SD卡权限<uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE" /> //写入SD卡权限
1.2 简单写一个布局文件,其中用到了GestureOverlayVIEw,相当于一个绘制组件。其中有一个重要属性gesturestrokeType,值为single时表示只绘制一笔,若要多笔绘制值应该设为multiple:
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:app="http://schemas.androID.com/apk/res-auto" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" tools:context=".addgesture.Main3Activity"> <button androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:onClick="recognition" androID:text="识别手势" /> <TextVIEw androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:gravity="center" androID:text="请绘制手势" /> <androID.gesture.GestureOverlayVIEw androID:ID="@+ID/activity_main3_gov" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:gesturestrokeType="multiple" //多笔绘制 ></androID.gesture.GestureOverlayVIEw></linearLayout>
1.3 这里自定义了AlertDialog的样式;
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical"> <linearLayout androID:layout_wIDth="match_parent" androID:layout_height="wrap_content"> <TextVIEw androID:layout_wIDth="wrap_content" androID:layout_height="match_parent" androID:gravity="center" androID:text="请输入手势名称" /> <EditText //输入手势的名称 androID:ID="@+ID/save_dialog_et" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" /> </linearLayout> <ImageVIEw //展示绘制的手势 androID:ID="@+ID/save_dialog_iv" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" /></linearLayout>
1.4 代码部分:
package com.example.mygesture.addgesture;import androID.Manifest;import androID.content.DialogInterface;import androID.content.Intent;import androID.content.pm.PackageManager;import androID.gesture.Gesture;import androID.gesture.GesturelibrarIEs;import androID.gesture.Gesturelibrary;import androID.gesture.GestureOverlayVIEw;import androID.graphics.Bitmap;import androID.graphics.color;import androID.support.v4.app.ActivityCompat;import androID.support.v7.app.AlertDialog;import androID.support.v7.app.AppCompatActivity;import androID.os.Bundle;import androID.vIEw.VIEw;import androID.Widget.EditText;import androID.Widget.ImageVIEw;import androID.Widget.Toast;import com.example.mygesture.R;import com.example.mygesture.recognitiongesture.Main4Activity;public class Main3Activity extends AppCompatActivity { GestureOverlayVIEw gov; //定义绘制组件 @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main3); if (ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},1); } //高版本需要动态申请权限 init(); } private voID init() { gov = findVIEwByID(R.ID.activity_main3_gov);// gov.setGesturecolor(color.RED); //设置绘制的颜色 gov.setGesturestrokeWIDth(4); //设置画笔的宽度 gov.addOnGesturePerformedListener(new GestureOverlayVIEw.OnGesturePerformedListener() { //设置绘制完成监听 @OverrIDe public voID onGesturePerformed(GestureOverlayVIEw overlay,final Gesture gesture) { VIEw saveDialog = getLayoutInflater().inflate(R.layout.save_dialog,null); //获取AlertDialog的布局样式 final EditText editText = saveDialog.findVIEwByID(R.ID.save_dialog_et); ImageVIEw imageVIEw = saveDialog.findVIEwByID(R.ID.save_dialog_iv); Bitmap bitmap = gesture.toBitmap(128,128,10,0xFFFF0000); //将手势转换为位图 imageVIEw.setimageBitmap(bitmap); //用ImageVIEw加载手势图片 new AlertDialog.Builder(Main3Activity.this).setVIEw(saveDialog).setPositivebutton("确定",new DialogInterface.OnClickListener() { @OverrIDe public voID onClick(DialogInterface dialog,int which) { Gesturelibrary gesturelibrary = GesturelibrarIEs.fromfile("/mnt/sdcard/mygesture");//利用手势库获取存放手势文件的地址 gesturelibrary.addGesture(editText.getText().toString(),gesture); //向手势库中添加手势名称和手势 gesturelibrary.save(); //保存手势库 Toast.makeText(Main3Activity.this,"保存成功",Toast.LENGTH_SHORT).show(); } }).setNegativebutton("取消",null) .show(); } }); } public voID recognition(VIEw vIEw) { Intent intent = new Intent(this,Main4Activity.class); startActivity(intent); }}
2. 接下来完成识别手势的Activity:
2.1 一样的先写布局文件
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:app="http://schemas.androID.com/apk/res-auto" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" tools:context=".recognitiongesture.Main4Activity"> <TextVIEw androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:gravity="center" androID:text="请绘制需要识别的手势" /> <androID.gesture.GestureOverlayVIEw androID:ID="@+ID/activity_main4_gov" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"></androID.gesture.GestureOverlayVIEw></linearLayout>
2.2 代码的编写
package com.example.mygesture.recognitiongesture;import androID.gesture.Gesture;import androID.gesture.GesturelibrarIEs;import androID.gesture.Gesturelibrary;import androID.gesture.GestureOverlayVIEw;import androID.gesture.Prediction;import androID.support.v7.app.AlertDialog;import androID.support.v7.app.AppCompatActivity;import androID.os.Bundle;import androID.Widget.ArrayAdapter;import androID.Widget.Toast;import com.example.mygesture.R;import java.util.ArrayList;import java.util.logging.Level;public class Main4Activity extends AppCompatActivity { GestureOverlayVIEw gov; Gesturelibrary gesturelibrary; //定义手势库 @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main4); init(); } private voID init() { gesturelibrary = GesturelibrarIEs.fromfile("/mnt/sdcard/mygesture"); //获取手势文件 if (gesturelibrary.load()) { //判断手势文件是否存在以及加载 Toast.makeText(this,"手势文件加载成功",Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this,"手势文件加载失败",Toast.LENGTH_SHORT).show(); } gov = findVIEwByID(R.ID.activity_main4_gov); gov.addOnGesturePerformedListener(new GestureOverlayVIEw.OnGesturePerformedListener() { @OverrIDe public voID onGesturePerformed(GestureOverlayVIEw overlay,Gesture gesture) { ArrayList<Prediction> predictions = gesturelibrary.recognize(gesture); //匹配手势库中的所有手势 ArrayList<String> result = new ArrayList<>(); //匹配结果数组 for (Prediction pred : predictions) { if (pred.score > 2) { //匹配手势库中的所有手势,并将相似度>2存入匹配结果数组 result.add("相似度:" + pred.score); } } if (result.size() > 0) { //这里用了适配器来作为AlertDialog的布局样式,用于显示所有手势的相似度 ArrayAdapter<Object> arrayAdapter = new ArrayAdapter<Object>(Main4Activity.this,androID.R.layout.simple_dropdown_item_1line,result.toArray()); new AlertDialog.Builder(Main4Activity.this).setAdapter(arrayAdapter,null).setPositivebutton("确定",null).show(); } else { Toast.makeText(Main4Activity.this,"未找到与之匹配的手势",Toast.LENGTH_SHORT).show(); } } }); }}
总结
以上所述是小编给大家介绍的AndroID实现自定义手势和识别手势的功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
以上是内存溢出为你收集整理的Android实现自定义手势和识别手势的功能全部内容,希望文章能够帮你解决Android实现自定义手势和识别手势的功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)