Android 手势识别开发—手势自动拨号

本文Android手势识别主要开发两个功能

  • 识别手势自动拨号
  • 识别手势关闭程序


第一步:建立手势库

使用sdk自带例子GestureBuilder建立手势库(位置:adt-bundle-windows-x86-20140321\sdk\samples\android-15\GestureBuilder)。使用GestureBuilder之前,你需要恢复其到开发环境中,然后进行编译并部署到手机上。此时,就可以使用GestureBuilder建立手势库,生成的手势库文件在sdcard上,默认文件名称为:gestures。

具体步骤:

1. sdk目录下找到工程GestureBuilder,复制GestureBuilder到Android workspaces目录下。

2. 新建我的项目gesture,复制项目gesture目录下的如下三个文件到GestureBuilder根目录下,

3. 将GestureBuilder导入eclipse中,编译部署到模拟器上运行,建立手势库如下,

4. 建立完毕后,在sdcard目录下生成手势库文件gestures,导出文件gestures。

第二步:开发手势识别

在应用中加载手势库文件gestures,然后开发手势识别代码。

将手势库文件gestures复制到项目gesture的res/raw目录下。这时候在项目gesture的R文件中就可以看到gestures的id了。然后在布局文件中添加用于手势绘制的view:

    <android.gesture.GestureOverlayView
        android:id="@+id/gestures"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gestureStrokeType="multiple" />

大多数情况下,手势都是通过一笔完成。然而有一些特别的需求就需要通过多个笔画来实现,这是可以使用gestureStrokeType属性进行设置:android:gestureStrokeType=”multiple”。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <android.gesture.GestureOverlayView
        android:id="@+id/gestures"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gestureStrokeType="multiple" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:onClick="find"
        android:text="@string/recognize" />

</LinearLayout>

MainActivity.java

package cn.itcast.gesture;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGestureListener;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.gesture.Prediction;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    private GestureLibrary library;
    private Gesture mgesture;
    private GestureOverlayView overlayView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        library = GestureLibraries.fromRawResource(this, R.raw.gestures);//得到手势库
        library.load();//加载手势库

        overlayView = (GestureOverlayView) this.findViewById(R.id.gestures);
        //只针对单笔手势:overlayView.addOnGesturePerformedListener(new GesturePerformedListener());
        overlayView.addOnGestureListener(new GestureListener());//为view添加手势监听事件
    }

    public void find(View v){
        recognize(mgesture);
        overlayView.clear(true);
    }

    private final class GestureListener implements OnGestureListener{
        public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
            Log.i(TAG, "onGestureStarted()");
        }
        public void onGesture(GestureOverlayView overlay, MotionEvent event) {
            Log.i(TAG, "onGesture()");
        }
        public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
            Log.i(TAG, "onGestureEnded()");
            mgesture = overlay.getGesture();
        }
        public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
            Log.i(TAG, "onGestureCancelled()");
        }
    }

    private final class GesturePerformedListener implements OnGesturePerformedListener{
        public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
            recognize(gesture);
        }
    }

    private void recognize(Gesture gesture) {
        //从手势库中查询匹配的内容,匹配的结果可能包括多个相似的内容,匹配度高的结果放在最前面。
        ArrayList<Prediction> predictions = library.recognize(gesture);
        if(!predictions.isEmpty()){
            Prediction prediction = predictions.get(0);
            if(prediction.score >= 6){//匹配率大于60%
                if("call".equals(prediction.name)){
                    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:1350505050"));
                    startActivity(intent);
                }else if("close".equals(prediction.name)){
                    finish();//关闭Activity
                }
            }else{
                Toast.makeText(getApplicationContext(), R.string.low, 1).show();
            }
        }else{
            Toast.makeText(getApplicationContext(), R.string.notfind, 1).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        android.os.Process.killProcess(android.os.Process.myPid());//关闭应用
    }

}

编译部署到模拟器中运行,当输入手势对勾,程序主动自动关闭退出。当应用不再使用时,通常需要关闭应用,可以使用一下三种方法关闭android应用,

  • 获取当前进行的id,然后杀死进程(建议使用)

android.os.Process.killProcess(android.os.Process.myPid());//关闭应用

  • 终止当前正在运行的java虚拟机,导致程序终止

System.exit(0);

  • 强制关闭与该包有关联的一切执行

ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

manager.restartPackage(getPackageName());

< uses-permisson android:name=”android.permission.RESTART_PACKAGESS”/>

除此之外,当画出手势z时,自动拨号

利用Android手势识别可以开发如下功能,比如说:

  • 手机解锁密码
  • 应用快捷方式(拨号、打开程序等)
时间: 2024-10-05 06:05:24

Android 手势识别开发—手势自动拨号的相关文章

Android之如何实现自动拨号,打开网页的功能【超链接】

3.自动拨号,打开网页等功能: 注意不要忘了导入权限 <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:autoLink="all"//设置链接的支持功能,all代表支持全部功能,还可以选择,也可以单独选 android:background="#ffcc00" android:singleL

如何关闭android studio开发环境自动保存

使用DW习惯了现在转到学习开发android,请问怎样关闭android studio的自动保存功能,然后按ctrl+s进行保存,因为有时候代码不想让其保存,他也自动保存了. File -> Setting -> General -> Save files on frame deactivation 和 Save files automatically if application is idle for .. sec 去掉

【Android】手势输入拨号器

主要是通过这个小app来说明怎么对安卓的app添加手势操作. 如下图,用户可以通过手势输入数字,最终,通过手势输入完号码之后,点击"拨号"按钮可以拨号. 一.手势准备 1.为了实现这个app,我们先要准备0-9这10个数字的手势.首先,你必须先打开的你的安卓模拟器AVD,里面有一个gestures builder的工具,想打开普通app一样,打开它. 2.这个系统工具的app在所有AVD里面都会存在的.普通的手机.平板是没有的,开发人员工具.点击右下角的Add gesture可以进入添

Android开发之自动更换壁纸

本程序主要实现了: 1.使用AssetManager将assets目录中的文件复制到SD卡的指定位置 2.使用AlarmManager全局定时器,周期性的启动指定组件切换壁纸 3.使用SharedPreferences,将用户个性化的设置保存到手机(例如壁纸切换频率) 4.使用自定义标题栏 5.使用了GestureDetector手势检测器,允许用户滑动切屏 6.使用了overridePendingTransition,在切屏的时候有动画效果 程序运行效果图: 程序代码: ChangeWallp

android开发中eclipse里xml开发的自动提示和使用帮助快捷键提示

Eclipse Android 代码自动提示功能 Eclipse for android 设置代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java ,设置框中默认是一个点, .abcdefghijklmnopqrstuvwxyz(, 打 开 Eclipse 依次选择 Window > Preference

如何实现android蓝牙开发 自动配对连接,并不弹出提示框

如何实现android蓝牙开发 自动配对连接,并不弹出提示框 之前做一个android版的蓝牙,遇到最大的难题就是自动配对. 上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了 我就开始查找怎么关闭这个蓝牙配对提示框,后面还是伟大的android源码帮助了我. 在源码 BluetoothDevice 类中还有两个隐藏方法 cancelBondProcess()和cancelPairingUserInput() 这两个方法一个是取消配对进

Android开发之自动登录功能的实现

在我们平时使用的手机应用都可以实现只需要登陆一次账号后,第二次进入应用直接跳转到效果界面的效果,还有QQ的登陆框是如何记忆我们的隐身登陆,保存账号选项的呢,这些都是通过使用SharedPreferences共享参数效果实现的,而无须使用数据库来存储.以下我们直接看详细代码分析. package com.example.account.login; import java.util.HashMap; import java.util.Map; import com.android.dao.MySQ

Android开发实例-自动生成题库的数独(一)

转载请注明出处:http://blog.csdn.net/einarzhang/article/details/44834259 本系列文章主要介绍如何利用Android开发一个自动生成题目的数独游戏.涉及的知识和技术如下所示: 挖洞算法自动生成数独题目 实现自定义View用于绘制数独盘 数据库的基本操作 看着市场上千篇一律的数独应用,他们大都来自于同一个开源应用,题目都是固定不变的那么100多道.我们就没有方法改变数独题目吗?经过百度搜索,终于找到了一篇自动生成数独题库的算法,感谢原作者的理论

Android应用开发-小巫CSDN博客客户端开发开篇

Android应用开发-小巫CSDN博客客户端开发开篇 2014年9月8日 八月十五 祝各位中秋节快乐 小巫断断续续花了几个星期的时间开发了这么一款应用--小巫CSDN博客,属于私人定制的这样的一款应用,整个客户端的数据全部来自本人博客,是通过爬取本人博客地址html页面,然后解析html把数据提取出来,整个客户端的技术难点主要是如何对html界面进行分析和使用Jsoup对html代码进行解析.目前本人的这款应用已经开发出来了,近段时间会提交应用商店进行审核,不久大家就可以看到这么一款逼格满满的