1.常用手勢
andorid中手機交互的執行過程
1.手指觸碰屏幕,觸發MotionEvent事件
2.該事件可以被onTouchListener監聽
3.通過 GestureDetector(該類是手勢的一個封裝類)轉發我們的手指觸碰事件給OnGestureListener
4.在監聽值執行相應的邏輯
- MotionEvent 是一個封裝了觸碰,觸摸筆等的動作事件,包含兩個重要的變量x,y
- GestureDetector 就是一個識別手勢的封裝類
- OnGestureListener手勢的監聽接口,GestureDetector中識別到手勢就會觸發相應的監聽事件。
OnGestureListener中提供的方法:
//就是觸碰的那一剎那
@Override public boolean onDown(MotionEvent e) { return false; } //手指按在觸摸屏上 其實就是一剎那 -- 長按 之間那一段 @Override public void onShowPress(MotionEvent e) { } //手指離開觸目屏那一剎那 @Override public boolean onSingleTapUp(MotionEvent e) { return false; } //手指在觸摸屏上滑動 @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } //也就是我們所說的長按 @Override public void onLongPress(MotionEvent e) { } //手指在觸摸屏上迅速挪動並且拋開,其實就是下拉,側滑等等 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; }
如何實現簡單的手勢測試呢:
step1:創建GestureDetector對象 兩個參數,一個上下文,一個監聽器
GestureDetecto xx = new GestureDetecto(Context context,OnGestureListener, onGestureListener)
step2:在觸碰事件監聽類中,將觸碰事件交給我們的GestureDetector處理
public boolean onTouchEvent(MotionEvent event) { return mDetector.onTouchEvent(event); }
我么會發現,如果我們要實現設置某一個事件的邏輯,需要實現這么多的事件,顯然這不合理,當然官方也為我們提供了SimpleOnGestureListener相當於一個已經實現方法的類,
我們只需要重寫我們想實現的方法即可。
2.創建手勢
android還為我們提供了自定義的手勢的添加和使用:
首先我們來了了解幾個類
1.GestureLibraries 可以看出這是一個手勢庫的意思,沒錯我們可以保存我們自定義的手勢到我們的手機中。
構造方法:
static GestureLibrariey fromFile(File file)//指定文件 后邊也可以是中的String 文件目錄,還有其他的構造方法,大家查閱相應的api即可
常用的API:
- public void addGesture (String entryName, Gesture gesture):添加一個名為entryName的手勢
- public Set getGestureEntries ():獲得手勢庫中所有手勢的名稱
- public ArrayList getGestures (String entryName):獲得entryName名稱對應的全部手勢
- public ArrayList recognize (Gesture gesture): 從當前手勢庫中識別與gesture匹配的全部手勢
- public void removeEntry (String entryName):刪除手勢庫中entryName名稱對應的手勢
- public void removeGesture (String entryName, Gesture gesture):刪除手勢庫中entryName和gesture都匹配的手勢
- public abstract boolean save ():想手勢庫中添加手勢或從中刪除手勢后調用該方法保存手勢庫
2.GestureOverlayView手勢編輯組件:這是一個手勢手編寫組件,可以使用他來創建一個手勢,然后將手勢通過GestureLibraries保存到本地即可
主要是提供了三種監聽接口一旦我們的手勢完成就會調用我們的相應方法,保存手勢即可
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
//首先我們設置我們的 手勢組件 gestureOverlayView = (GestureOverlayView)findViewById(R.id.gesture);
//設置顏色,畫筆的寬度 gestureOverlayView.setGestureColor(Color.RED); gestureOverlayView.setGestureStrokeWidth(5);
//為我們的手勢控件添加監聽方法,如果手勢完成,就調用其中的監聽方法 gestureOverlayView.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() { @Override public void onGesturePerformed(GestureOverlayView overlay, final Gesture gesture) {
//通過打氣筒 獲取我們的layout 三個參數 第一個參數就是要獲取layout的id 第二個是指定一個view的外邊布局,第三個參數如果為false則布局加到view上返回的是我們呢的view,如果是true則返回第二個參數布局 View view = MainActivity.this.getLayoutInflater().inflate(R.layout.layout, null, false); final EditText editText = (EditText)view.findViewById(R.id.text); ImageView imageView = (ImageView)view.findViewById(R.id.image); //將手勢轉換成為位圖 Bitmap bitmap = gesture.toBitmap(528, 528, 10, 0xffff0000);
//設置我們的位圖 imageView.setImageBitmap(bitmap); new AlertDialog.Builder(MainActivity.this).setView(view).setPositiveButton("保存", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) {
//獲取sd卡的路徑 File file = new File(Environment.getExternalStorageDirectory(),"mnt/sdcard/testGesture"); //創建保存目錄 gestureLibrary = GestureLibraries.fromFile(file); //添加手勢到文件中保存文件 gestureLibrary.addGesture(editText.getText().toString().trim(),gesture); gestureLibrary.save(); } }).setNegativeButton("取消", null).show(); } });
在layout中設置手勢組件GestureOverlayView,然后設置手勢完成的監聽方法,創建GestureLibrary 手勢庫,然后通過addGesture中添加一個手勢,
別忘了通過save方法保存我們的手勢o
3.手勢判斷
這里我們主要講一下我們自定義的手勢該如何的去使用
其實我們的思路很簡單,就是從畫一個手勢,然后與手勢庫中的手勢進行一個比對,比對他們的一個相似度。
首先獲取指定位置的手勢庫,然后通過public ArrayList recognize (Gesture gesture): 從當前手勢庫中識別與gesture匹配的全部手勢。
注意返回的是一個匹配手勢的ArrayList<Prediction>集合 Prediction的socre可以決定匹配的匹配度是多少,他還封裝了一個name屬性表示手勢的名字。
注意: gesture.toBitmap() 是一個手勢轉換位圖的方法。