android手势识别
生活随笔
收集整理的這篇文章主要介紹了
android手势识别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、簡單手勢識別:
簡單手勢識別分為以下幾個步驟:
1.手指觸碰屏幕時,觸發MotionEvent事件;2.該事件被OnTouchListener監聽,可在它的onTouch()方法中獲得該MotionEvent對象;3.通過GestureDetector轉發MotionEvent對象給OnGestureListener;4.我們可以通過OnGestureListener獲得該對象,然后獲取相關信息,以及做相關處理。MotionEvent中封裝了手勢動作事件和x、y坐標信息。
GestureDetector對手勢進行加工,交給GestureListener進行處理。
GestureDetector提供了OnDoubleTapListener、OnGestureListener兩種監聽器,同時提供了SimpleOnGestureListener類進行適配,讓我們選擇需要的接口進行實現。
我們主要的工作就在步驟4,在GestureListener中對用戶的手勢操作進行分析和處理。
?
GestureListener有以下回調接口:
onDown: 按下,只要手指觸碰即觸發。onFling: 快速滑動并松開。onLongPress: 長按。onScroll: 滑動。onShowPress: 短按。onSingleTapUp:抬起。?
OnDoubleTapListener有以下接口:
onSingleTapConfirmed :單擊。onDoubleTap :雙擊onDoubleTapEvent:雙擊中的第二次按下后事件觸發。?
下面是簡單的測試代碼:
public class MainActivity extends AppCompatActivity {private ImageView iv;private GestureDetector gestureDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);gestureDetector=new GestureDetector(this,new MyGestureLsn());iv= (ImageView) findViewById(R.id.iv);iv.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {gestureDetector.onTouchEvent(event);return true;}});}class MyGestureLsn extends GestureDetector.SimpleOnGestureListener{@Overridepublic boolean onSingleTapUp(MotionEvent e) {Show.log("onSingleTapUp");return super.onSingleTapUp(e);}@Overridepublic void onLongPress(MotionEvent e) {Show.log("onLongPress");super.onLongPress(e);}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {Show.log("onScroll");return super.onScroll(e1, e2, distanceX, distanceY);}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {Show.log("onFling");return super.onFling(e1, e2, velocityX, velocityY);}@Overridepublic void onShowPress(MotionEvent e) {Show.log("onShowPress");super.onShowPress(e);}@Overridepublic boolean onDown(MotionEvent e) {Show.log("onDown");return super.onDown(e);}@Overridepublic boolean onDoubleTap(MotionEvent e) {Show.log("onDoubleTap");return super.onDoubleTap(e);}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {Show.log("onDoubleTapEvent");return super.onDoubleTapEvent(e);}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {Show.log("onSingleTapConfirmed");return super.onSingleTapConfirmed(e);}} }?
?
二、復雜手勢識別
1.生成手勢庫文件
?android提供了GestureOverlayView類用于復雜手勢的識別,首先得創建手勢庫文件,建議用谷歌提供的一個工具——GestureBuilder項目來生成,
當然也可以自己創建一個項目來生成,下面是一段創建手勢庫的簡單代碼:
GestureOverlayView gesture = (GestureOverlayView) findViewById(R.id.gesture);gesture.setGestureColor(Color.GREEN);gesture.setGestureStrokeWidth(5);gesture.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {@Overridepublic void onGesturePerformed(GestureOverlayView gestureOverlayView, final Gesture gesture) {View saveDialog = getLayoutInflater().inflate(R.layout.dialog_save, null, false);ImageView img_show = (ImageView) saveDialog.findViewById(R.id.img_show);Bitmap bitmap = gesture.toBitmap(128, 128, 10, 0xffff0000);img_show.setImageBitmap(bitmap);new AlertDialog.Builder(MainActivity.this).setView(saveDialog).setPositiveButton("保存", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {//獲取文件對應的手勢庫GestureLibrary gestureLib = GestureLibraries.fromFile("/mnt/sdcard/gestures");gestureLib.addGesture("gesture name", gesture);gestureLib.save();}}).setNegativeButton("取消", null).show();}});每個手勢都對應一個名字,為了防止識別錯誤,最好讓各個手勢之間的差別足夠大。
2.識別
首先得將手勢庫文件導入到項目中,然后在將新手勢和手勢庫中的進行匹配:
GestureLibrary gestureLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);if (gestureLibrary.load()) {//加載成功} else {//加載失敗 }GestureOverlayView gesture = (GestureOverlayView) findViewById(R.id.gesture);gesture.setGestureColor(Color.GREEN);gesture.setGestureStrokeWidth(5);gesture.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {@Overridepublic void onGesturePerformed(GestureOverlayView gestureOverlayView, final Gesture gesture) {//識別用戶剛繪制的手勢ArrayList<Prediction> predictions = gestureLibrary.recognize(gesture);ArrayList<String> result = new ArrayList<String>();//遍歷所有找到的Prediction對象for (Prediction pred : predictions) {if (pred.score > 1.0) {result.add("與手勢【" + pred.name + "】相似度為" + pred.score);}}if (result.size() > 0) {ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(MainActivity.this,android.R.layout.simple_dropdown_item_1line, result.toArray());new AlertDialog.Builder(MainActivity.this).setAdapter(adapter, null).setPositiveButton("確定", null).show();} else {Toast.makeText(MainActivity.this, "無法找到匹配的手勢!", Toast.LENGTH_SHORT).show();}}});?
?
?
?
轉載于:https://www.cnblogs.com/zhisuoyu/p/5516514.html
總結
以上是生活随笔為你收集整理的android手势识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辗转相除求最大公约数
- 下一篇: cxf 发布 一个简单的 webserv