600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Android中实现自定义手势和识别手势的功能

Android中实现自定义手势和识别手势的功能

时间:2020-02-19 13:07:44

相关推荐

Android中实现自定义手势和识别手势的功能

Android中实现自定义手势和识别手势的功能

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="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".addgesture.Main3Activity"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="recognition"android:text="识别手势" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="请绘制手势" /><android.gesture.GestureOverlayViewandroid: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="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid: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;//定义绘制组件@Overrideprotected 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() {//设置绘制完成监听@Overridepublic 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() {@Overridepublic 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="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".recognitiongesture.Main4Activity"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="请绘制需要识别的手势" /><android.gesture.GestureOverlayViewandroid: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;//定义手势库@Overrideprotected 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() {@Overridepublic 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();}}});}}

3.到这里也算大功告成了,效果图我就不贴了,因为不能上传视频,GIF图也不好搞。

Tip:小白,写得不好请见谅。若有不对的地方请留言。

关于手势部分的功能点:Android中简单实现页面翻转和自动翻转的功能,Android中实现双指缩放的功能

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。