Android-手勢識別(普通手勢識別:上 下 左 右 ;自訂手勢識別:對號,錯號 等)
1.回顧
上篇學習了 Android 系統服務的 10個執行個體 ,當然 還有更多的系統服務沒有使用;留下來的遺憾就是,昨晚沒有將demo分享出去;
2.重點
(1)OnTouchListener 實現 上下左右手勢識別
(2)OnTouchListener + SimpleOnGestureListener + GestureDetector 實現 上下左右 手勢識別
(3)GestureOverlayView + GestureLibrary + OnGesturePerformedListener 實現 自訂手勢識別
3.
普通手勢識別: 自訂手勢識別:
4. 圖片準備
為了實現的效果更好一點,使用 ps 做了 9張 圖片 ,來作為響應 ,更直觀 的顯示;
(1)待機
(2)普通手勢判斷:上下左右
(3)自訂手勢判斷 :對號,錯號,圓,雷
5. OnTouchListener 實現 上下左右手勢識別
5.1 思路
(1) OnTouchListener 在前面使用過,在 做 圖片輪播(ViewFlipper) 的時候使用過 ;
(2)基本思路一樣,設定 OnTouchListener ,進行判斷 ;
5.2 實現
給圖片或者布局設定監聽即可;
/** * * 第一種方式: * 添加觸摸 事件監聽器 * @author yuan * */class imgtestTouchListener implements OnTouchListener{private int x=0;private int y=0;@Overridepublic boolean onTouch(View v, MotionEvent event) {// 可以通過 x ,y 來判斷 滑動的手勢//不過只可以判斷:上滑,下滑,左滑,右滑 switch (event.getAction()) { case MotionEvent.ACTION_DOWN://手指按下的時候:初始化 x,y 值x=(int) event.getX();y=(int) event.getY();break;case MotionEvent.ACTION_MOVE://移動就不說了,因為在這裡判斷手勢,只和 按下的位置和 抬起來的位置 有關;break;case MotionEvent.ACTION_UP:/* * 手指抬起來觸發 ,所以判斷在這裡進行 * 1.獲得結束的x,y * 2.進行判斷 */int upx=(int) event.getX();int upy=(int) event.getY();String result=drawTouch(upx,upy);//提醒textView1.setText(result);break;}return true;}private String drawTouch(int upx,int upy){String str=沒有滑動;//水平滑動if(upx-x>100){str=向右滑動;//改變圖片img_test.setImageResource(R.drawable.icon_right);}else if(x-upx>100){str=向左滑動;//改變圖片img_test.setImageResource(R.drawable.icon_left);}else if(upy-y>100){str=向下滑動;//改變圖片img_test.setImageResource(R.drawable.icon_down);}else if(y-upy>100){str=向上滑動;//改變圖片img_test.setImageResource(R.drawable.icon_up);}return str;}}
6.OnTouchListener + SimpleOnGestureListener + GestureDetector 實現 上下左右 手勢識別
6.1 思路
(1)和 使用 OnTouchListener 一樣,不過是將 MotionEvent 對象交給 GestureDeteCtor 對象 處理
(2)GestureDetector 實現的不僅僅 實現 上下左右的判斷,還有很多 這裡僅僅 重新了 onFling() 方法
6.2 實現
(1)聲明 並 執行個體化 GestureDetector
private GestureDetector gestureDetector;
(2)一定在 OnCreate 裡執行個體化 ,不然報 null 指標 異常
//00.初始化 GestureDetector 對象gestureDetector=new GestureDetector(MainActivity.this,new GestureDelectorSimlpeListener());
(3)實現 SimpleOnGestureListener 監聽
/** * 2.繼承 SimpleOnGestureListener * 重載 感興趣的 手勢 * @author yuan * */class GestureDelectorSimlpeListener extends SimpleOnGestureListener{@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {/* * 滑動 使用 onFling()方法 * 3.判斷 */String result=drawTouch(e1.getX(),e1.getY(),e2.getX(),e2.getY());textView1.setText(result);return true;}/** * 手勢判斷 * @param x * @param y * @param upx * @param upy * @return */private String drawTouch(float x,float y,float upx,float upy){String str=沒有滑動;//水平滑動if(upx-x>100){str=向右滑動;//改變圖片img_test.setImageResource(R.drawable.icon_right);}else if(x-upx>100){str=向左滑動;//改變圖片img_test.setImageResource(R.drawable.icon_left);}else if(upy-y>100){str=向下滑動;//改變圖片img_test.setImageResource(R.drawable.icon_down);}else if(y-upy>100){str=向上滑動;//改變圖片img_test.setImageResource(R.drawable.icon_up);}return str;}}
(4)實現 OnTouchListener 監聽
/** * 第二種方式 * * 使用 GestureDetector 來進行操作 * */class GestureOntouchListener implements OnTouchListener{@Overridepublic boolean onTouch(View v, MotionEvent event) {//1.獲得 motionEvent 對象gestureDetector.onTouchEvent(event);return true;}}