andorid中手機交互的執行過程android
1.手指觸碰屏幕,觸發MotionEvent事件api
2.該事件能夠被onTouchListener監聽ide
3.經過 GestureDetector(該類是手勢的一個封裝類)轉發咱們的手指觸碰事件給OnGestureListener佈局
4.在監聽值執行相應的邏輯測試
OnGestureListener中提供的方法:ui
//就是觸碰的那一剎那
@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對象 兩個參數,一個上下文,一個監聽器this
GestureDetecto xx = new GestureDetecto(Context context,OnGestureListener, onGestureListener)spa
step2:在觸碰事件監聽類中,將觸碰事件交給咱們的GestureDetector處理code
public boolean onTouchEvent(MotionEvent event) { return mDetector.onTouchEvent(event); }orm
我麼會發現,若是咱們要實現設置某一個事件的邏輯,須要實現這麼多的事件,顯然這不合理,固然官方也爲咱們提供了SimpleOnGestureListener至關於一個已經實現方法的類,
咱們只須要重寫咱們想實現的方法便可。
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
這裏咱們主要講一下咱們自定義的手勢該如何的去使用
其實咱們的思路很簡單,就是從畫一個手勢,而後與手勢庫中的手勢進行一個比對,比對他們的一個類似度。
首先獲取指定位置的手勢庫,而後經過public ArrayList recognize (Gesture gesture): 從當前手勢庫中識別與gesture匹配的所有手勢。
注意返回的是一個匹配手勢的ArrayList<Prediction>集合 Prediction的socre能夠決定匹配的匹配度是多少,他還封裝了一個name屬性表示手勢的名字。
注意: gesture.toBitmap() 是一個手勢轉換位圖的方法。