博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android基础系列 - 手势(二)自定义,识别手势
阅读量:4165 次
发布时间:2019-05-26

本文共 7038 字,大约阅读时间需要 23 分钟。

之前把谷歌提供的Android手势相关的官方文档和网上一些手势分析的文档,也写了一个简单的示例。

  • 手势识别(一) :

这里写图片描述

那么今天继续深入学习手势相关的API,增加手势提供了API,GestureLibrary和GestureOverlayView。

GestureLibrary中有几个常用的方法。

  • GestureLibraries .fromFile(Context con,String filepath); 获取GestureLibrary的主要途径。filepath是手势缓存的文件地址。

  • addGesture(String name,Gesture gesture);添加一个手势,name是该手势的名称。

  • save();调用保存的方法。

GestureOverlayView是手势相关API中直接与用户打交道的。它的一些常用方法。

  • setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);设置手势可多笔画绘制,默认情况为单笔画绘制 。

  • setGestureColor(Color.RED); 设置手势的颜色(红色) 。

  • setUncertainGestureColor(Color.RED);设置还没未能形成手势绘制是的颜色(红色) 。

  • setGestureStrokeWidth(10);设置手势宽度10。

  • setFadeOffset(500);手势绘制完成后淡出屏幕的时间间隔,即绘制完手指离开屏幕后相隔多长时间手势从屏幕上消失,可以理解为手势绘制完成手指离开屏幕后到调用onGesturePerformed的时间间隔,默认值为420毫秒,这里设置为0.5秒 。

  • addOnGesturePerformedListener(OnGesturePerformedListener listener);设置手势绘制监听回调。

    OnGesturePerformedListener 是手势已经形成回调的API。大致的使用方法以及意义了解之后就写一个简单的实例。

MainActivity,很多逻辑都写了注释。

package com.example.administrator.myapplication;import android.content.DialogInterface;import android.content.Intent;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.os.Bundle;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    EditText editText;    GestureOverlayView overlayView;    Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.editText);        overlayView = (GestureOverlayView) findViewById(R.id.gesture);        button = (Button) findViewById(R.id.btn);        //设置手势颜色        overlayView.setGestureColor(Color.RED);        //设置手势宽度        overlayView.setGestureStrokeWidth(10);        //获得手势的缓存        final GestureLibrary gestureLibrary = GestureLibraries.fromFile("/mnt/sdcard/mygestures");        //添加手势监听        overlayView.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {            @Override            public void onGesturePerformed(GestureOverlayView gestureOverlayView, final Gesture gesture) {                //加载提示界面                View save = getLayoutInflater().inflate(R.layout.save,null);                //获得提示界面的手势图片控件                ImageView imageView = (ImageView) save.findViewById(R.id.image);                final EditText editText = (EditText) save.findViewById(R.id.editText);                //将手势图片转码生成bitmap                Bitmap bitmap = gesture.toBitmap(128,128,10,0xffff0000);                imageView.setImageBitmap(bitmap);                //提示设置                new AlertDialog.Builder(MainActivity.this)                        .setView(save)                        .setPositiveButton("保存", new DialogInterface.OnClickListener() {                            @Override                            public void onClick(DialogInterface dialogInterface, int i) {                                //点击                                addGesture(gestureLibrary,editText,gesture);                            }                        }).setNegativeButton("取消",null).show();            }        });        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                startActivity(new Intent(MainActivity.this,GestureActivity.class));            }        });    }    private void addGesture(GestureLibrary gestureLibrary, EditText editText, Gesture gesture) {        //添加手势        gestureLibrary.addGesture(editText.getText().toString(),gesture);        //判断是否保存成功        if (gestureLibrary.save()){            Toast.makeText(MainActivity.this, "保存成功!", Toast.LENGTH_SHORT).show();        }else {            Toast.makeText(MainActivity.this, "保存失败!", Toast.LENGTH_SHORT).show();        }        //调用保存        gestureLibrary.save();    }}

我的主界面布局。

save.xml的布局。

手势从手势库加载,并进行识别。

package com.example.administrator.myapplication;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.util.Log;import android.widget.ArrayAdapter;import android.widget.Toast;import java.util.ArrayList;public class GestureActivity extends AppCompatActivity {    GestureOverlayView gesture_test;    GestureLibrary gestureLibrary;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_gesture);        gesture_test = (GestureOverlayView) findViewById(R.id.gesture_test);        gestureLibrary = GestureLibraries.fromFile("/mnt/sdcard/mygestures");        if (gestureLibrary.load()){            Toast.makeText(this, "文件手势加载成功。", Toast.LENGTH_SHORT).show();        }else {            Toast.makeText(this, "文件手势加载失败。", Toast.LENGTH_SHORT).show();        }        gesture_test.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {            @Override            public void onGesturePerformed(GestureOverlayView gestureOverlayView, Gesture gesture) {                ArrayList
predictions = gestureLibrary.recognize(gesture); ArrayList
result = new ArrayList
(); Log.i("tag00","数据库一共多少个手势:"+predictions.size()); for (Prediction prediction:predictions) { Log.i("tag00","手势:"+prediction.name +",相似度:"+prediction.score);// if (prediction.score > 2.0){ result.add("与手势【" + prediction.name + "】相似度为" + prediction.score);// } } if (result.size() > 0){ ArrayAdapter adapter = new ArrayAdapter(GestureActivity.this,android.R.layout.simple_dropdown_item_1line,result.toArray()); new AlertDialog.Builder(GestureActivity.this).setAdapter(adapter,null).setPositiveButton("确定",null).show(); }else { Toast.makeText(GestureActivity.this, "无法找到能匹配的手势!", Toast.LENGTH_SHORT).show(); } } }); }}

识别界面非常简单。

记得添加权限:

由于这个是手势相关的,模拟器不太好运行,真机做一个gif也比较麻烦。以上代码我已经测试没有问题。可以直接使用。这些就是手势的简单自定义和识别。

转载地址:http://kyqxi.baihongyu.com/

你可能感兴趣的文章
嵌入式100题(003):什么时候用进程,什么时候用线程
查看>>
嵌入式100题(004):多进程、多线程同步(通讯)的方法
查看>>
嵌入式100题(005):进程的空间模型
查看>>
嵌入式100题(006):进程线程的状态转换
查看>>
嵌入式100题(007):父进程、子进程的关系以及区别
查看>>
嵌入式100题(008):什么是进程上下文、中断上下文
查看>>
嵌入式100题(017):malloc的底层实现
查看>>
嵌入式100题(018):在1G内存的计算机中能否malloc(1.2G)?为什么?
查看>>
嵌入式100题(019):指针与引用的相同和区别;如何相互转换?
查看>>
嵌入式100题(040):什么是三次握手
查看>>
嵌入式100题(037):Http1.1和Http1.0的区别
查看>>
嵌入式100题(038):HTTPS与HTTP的一些区别
查看>>
嵌入式100题(042):为什么服务端易受到SYN攻击?
查看>>
嵌入式100题(043):什么是四次挥手
查看>>
嵌入式100题(044):为什么客户端最后还要等待2MSL?
查看>>
嵌入式100题(045):为什么建立连接是三次握手,关闭连接确是四次挥手呢?...
查看>>
嵌入式100题(028):static的用法(定义和用途)
查看>>
嵌入式100题(027):char和int之间的转换
查看>>
嵌入式100题(029):const常量和#define的区别(编译阶段、安全性、内存占用等)...
查看>>
嵌入式100题(030):volatile作用和用法
查看>>