android手势识别
一、簡(jiǎn)單手勢(shì)識(shí)別:
簡(jiǎn)單手勢(shì)識(shí)別分為以下幾個(gè)步驟:
1.手指觸碰屏幕時(shí),觸發(fā)MotionEvent事件;2.該事件被OnTouchListener監(jiān)聽,可在它的onTouch()方法中獲得該MotionEvent對(duì)象;3.通過GestureDetector轉(zhuǎn)發(fā)MotionEvent對(duì)象給OnGestureListener;4.我們可以通過OnGestureListener獲得該對(duì)象,然后獲取相關(guān)信息,以及做相關(guān)處理。MotionEvent中封裝了手勢(shì)動(dòng)作事件和x、y坐標(biāo)信息。
GestureDetector對(duì)手勢(shì)進(jìn)行加工,交給GestureListener進(jìn)行處理。
GestureDetector提供了OnDoubleTapListener、OnGestureListener兩種監(jiān)聽器,同時(shí)提供了SimpleOnGestureListener類進(jìn)行適配,讓我們選擇需要的接口進(jìn)行實(shí)現(xiàn)。
我們主要的工作就在步驟4,在GestureListener中對(duì)用戶的手勢(shì)操作進(jìn)行分析和處理。
?
GestureListener有以下回調(diào)接口:
onDown: 按下,只要手指觸碰即觸發(fā)。onFling: 快速滑動(dòng)并松開。onLongPress: 長(zhǎng)按。onScroll: 滑動(dòng)。onShowPress: 短按。onSingleTapUp:抬起。?
OnDoubleTapListener有以下接口:
onSingleTapConfirmed :單擊。onDoubleTap :雙擊onDoubleTapEvent:雙擊中的第二次按下后事件觸發(fā)。?
下面是簡(jiǎn)單的測(cè)試代碼:
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);}} }?
?
二、復(fù)雜手勢(shì)識(shí)別
1.生成手勢(shì)庫文件
?android提供了GestureOverlayView類用于復(fù)雜手勢(shì)的識(shí)別,首先得創(chuàng)建手勢(shì)庫文件,建議用谷歌提供的一個(gè)工具——GestureBuilder項(xiàng)目來生成,
當(dāng)然也可以自己創(chuàng)建一個(gè)項(xiàng)目來生成,下面是一段創(chuàng)建手勢(shì)庫的簡(jiǎn)單代碼:
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) {//獲取文件對(duì)應(yīng)的手勢(shì)庫GestureLibrary gestureLib = GestureLibraries.fromFile("/mnt/sdcard/gestures");gestureLib.addGesture("gesture name", gesture);gestureLib.save();}}).setNegativeButton("取消", null).show();}});每個(gè)手勢(shì)都對(duì)應(yīng)一個(gè)名字,為了防止識(shí)別錯(cuò)誤,最好讓各個(gè)手勢(shì)之間的差別足夠大。
2.識(shí)別
首先得將手勢(shì)庫文件導(dǎo)入到項(xiàng)目中,然后在將新手勢(shì)和手勢(shì)庫中的進(jìn)行匹配:
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) {//識(shí)別用戶剛繪制的手勢(shì)ArrayList<Prediction> predictions = gestureLibrary.recognize(gesture);ArrayList<String> result = new ArrayList<String>();//遍歷所有找到的Prediction對(duì)象for (Prediction pred : predictions) {if (pred.score > 1.0) {result.add("與手勢(shì)【" + 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, "無法找到匹配的手勢(shì)!", Toast.LENGTH_SHORT).show();}}});?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhisuoyu/p/5516514.html
總結(jié)
以上是生活随笔為你收集整理的android手势识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辗转相除求最大公约数
- 下一篇: cxf 发布 一个简单的 webserv