Android實現自定義手勢和識別手勢的功能

 更新時間:2019年10月11日 15:00:17   作者:季風__   我要評論
這篇文章主要介紹了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="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 Studio 3.0的下載安裝教程

    Android Studio 3.0的下載安裝教程

    Android Studio從3.0版本新增了許多功能,當然首當其沖就是從3.0版本新增了對 Kotlin 開發語言的支持,除此之外還有其他一些新功能,今天我們主要來看看如何更新Android Studio 3.0
    2017-10-10
  • android:descendantFocusability方法介紹

    android:descendantFocusability方法介紹

    開發中很常見的一個問題,項目中的listview不僅僅是簡單的文字,常常需要自己定義listview,問題就出現了,可能會發生點擊每一個item的時候沒有反應,無法獲取的焦點
    2012-11-11
  • Android學習教程之動態GridView控件使用(6)

    Android學習教程之動態GridView控件使用(6)

    這篇文章主要為大家詳細介紹了Android動態GridView控件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android實現帶數字的圓形進度條(自定義進度條)

    Android實現帶數字的圓形進度條(自定義進度條)

    在項目開發中經常遇到帶圓形進度條的需求,在GitHub上逛了一圈,發現沒有,今天小編抽空給大家分享Android實現帶數字的圓形進度條(自定義進度條),需要的朋友參考下
    2017-02-02
  • Android系統開發中log的使用方法及簡單的原理

    Android系統開發中log的使用方法及簡單的原理

    LOG是廣泛使用的用來記錄程序執行過程的機制,它既可以用于程序調試,也可以用于產品運營中的事件記錄;在平時開發過程中經常需要與log打交道,所以很有必要了解log的使用方法及簡單的原理,感興趣的朋友可以了解下啊
    2013-01-01
  • Android編程之數據庫Sql編程實例分析

    Android編程之數據庫Sql編程實例分析

    這篇文章主要介紹了Android編程之數據庫Sql編程,實例分析了Android操作Sqlite數據庫的相關技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • Android操作系統的架構設計分析

    Android操作系統的架構設計分析

    這篇文章主要介紹了Android操作系統的架構設計分析,Android系統架構分為Linux內核驅動、C/C ++框架、Java框架、Java應用程序,本文分別講解了它的作用,需要的朋友可以參考下
    2015-06-06
  • android實現狀態欄添加圖標的函數實例

    android實現狀態欄添加圖標的函數實例

    這篇文章主要介紹了android實現狀態欄添加圖標的函數,較為詳細的分析了Android狀態欄添加及刪除圖標的具體實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android 開發中Volley詳解及實例

    Android 開發中Volley詳解及實例

    這篇文章主要介紹了Android 開發中Volley詳解及實例的相關資料,需要的朋友可以參考下
    2017-04-04
  • Android開發實現橫向列表GridView橫向滾動的方法【附源碼下載】

    Android開發實現橫向列表GridView橫向滾動的方法【附源碼下載】

    這篇文章主要介紹了Android開發實現橫向列表GridView橫向滾動的方法,結合實例形式分析了Android橫向列表GridView實現橫向滾動的相關布局與功能實現技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2018-01-01

最新評論

pc蛋蛋计划下载