Android攻城狮GestureDetector和GestureOverlayView
生活随笔
收集整理的這篇文章主要介紹了
Android攻城狮GestureDetector和GestureOverlayView
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
手勢(shì)識(shí)別
可以通過以下兩種方式實(shí)現(xiàn):
1. 使用GestureDetector
2. 使用GestureOverlayView(屬于線程的控件)手勢(shì)交互過程(原理):
1. 觸屏一剎那,觸發(fā) MotionEvent 事件;
2. 被 OnTouchListener 監(jiān)聽,在 onTouch()中獲得 MotionEvent對(duì)象;
3. GestureDetector 轉(zhuǎn)發(fā) MotionEvent 對(duì)象至 OnGestureListener;
4. OnGestureListener 獲取該對(duì)象,根據(jù)該對(duì)象封裝的信息做出合適的反饋;MotionEvent:
1. 用于封裝手勢(shì)、觸摸筆、軌跡球等動(dòng)作事件;
2. 內(nèi)部封裝用于記錄橫軸和縱軸坐標(biāo)的屬性X和Y。
GestureDetector:
識(shí)別各種手勢(shì)。
OnGestureListener:
1. 手勢(shì)交互的監(jiān)聽接口,其提供多個(gè)抽象方法;
2. 根據(jù) GestureDetector 的手勢(shì)識(shí)別結(jié)果,調(diào)用相應(yīng)的方法。GestureDetector 詳解:
觸摸屏:按下、移動(dòng)、抬起等。
監(jiān)聽觸摸事件:重載 onTouch 或者設(shè)置 setOnTouchListener
GestureDetector 工作原理:
1. 當(dāng)接收到用戶觸摸消息時(shí),將消息交給 GestureDetector加工;
2. 通過設(shè)置監(jiān)聽器獲得 GestureDetector 處理后的手勢(shì)。
GestureDetector提供兩個(gè)監(jiān)聽器:
1. OnGestureListener:處理單擊類消息
2. OnDoubleTapListener:處理雙擊類消息
OnGestureListener接口的6個(gè)方法: 單擊:onDown(MotionEvent e) 抬起:onSingleTapUp(MotionEvent e) 短按:onShowPress(MotionEvent e) 長(zhǎng)按:onLongPress(MotionEvent e) 滾動(dòng):onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float disanceY) 滑動(dòng):onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) (注解:velocity:速率,速度)OnDoubleTapListener接口的3個(gè)方法: 雙擊:onDoubleTap(MotionEvent e) 雙擊按下和抬起各觸發(fā)一次:onDoubleTapEvent(MotionEvent e) 單擊確認(rèn):onSingleTapConfirmed(MotionEvent e)就是很快地按下并抬起,但不連續(xù)點(diǎn)擊第二下。如果分別去實(shí)現(xiàn)這兩個(gè)接口的所有方法,未免太麻煩了,所以這里提供了另一個(gè)接口:SimpleOnGestureListener,它已經(jīng)繼承了前面所講的兩個(gè)監(jiān)聽器。 - 繼承SimpleOnGestureListener - 重載感興趣的手勢(shì) 1 public class MainActivity extends Activity { 2 ImageView imageView; 3 GestureDetector myDetector; 4 5 class myGestureListenner extends SimpleOnGestureListener { 6 @Override 7 // e1表示起始事件,e2表示末尾事件,每個(gè)事件都含有坐標(biāo)屬性。通過起止事件的相對(duì)位置,可以判斷是從左往右滑動(dòng)還是從右往左滑動(dòng)。 8 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 9 float velocityY) { 10 // TODO Auto-generated method stub 11 if (e1.getX() - e2.getX() > 50) { 12 Toast.makeText(MainActivity.this, "從右邊往左邊滑動(dòng)!", 0).show(); 13 14 } else if (e2.getX() - e1.getX() > 50) { 15 Toast.makeText(MainActivity.this, "從左邊往右邊滑動(dòng)!", 0).show(); 16 } 17 return super.onFling(e1, e2, velocityX, velocityY); 18 } 19 20 } 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.fragment_main); 26 imageView = (ImageView) findViewById(R.id.image); 27 myDetector = new GestureDetector(new myGestureListenner()); 28 imageView.setOnTouchListener(new OnTouchListener() { 29 30 @Override 31 public boolean onTouch(View v, MotionEvent event) { 32 // TODO Auto-generated method stub 33 // 捕獲觸摸屏幕的Event事件 34 myDetector.onTouchEvent(event); 35 36 return true; 37 } 38 }); 39 } 40 41 }
OnGestureListener接口的6個(gè)方法: 單擊:onDown(MotionEvent e) 抬起:onSingleTapUp(MotionEvent e) 短按:onShowPress(MotionEvent e) 長(zhǎng)按:onLongPress(MotionEvent e) 滾動(dòng):onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float disanceY) 滑動(dòng):onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) (注解:velocity:速率,速度)OnDoubleTapListener接口的3個(gè)方法: 雙擊:onDoubleTap(MotionEvent e) 雙擊按下和抬起各觸發(fā)一次:onDoubleTapEvent(MotionEvent e) 單擊確認(rèn):onSingleTapConfirmed(MotionEvent e)就是很快地按下并抬起,但不連續(xù)點(diǎn)擊第二下。如果分別去實(shí)現(xiàn)這兩個(gè)接口的所有方法,未免太麻煩了,所以這里提供了另一個(gè)接口:SimpleOnGestureListener,它已經(jīng)繼承了前面所講的兩個(gè)監(jiān)聽器。 - 繼承SimpleOnGestureListener - 重載感興趣的手勢(shì) 1 public class MainActivity extends Activity { 2 ImageView imageView; 3 GestureDetector myDetector; 4 5 class myGestureListenner extends SimpleOnGestureListener { 6 @Override 7 // e1表示起始事件,e2表示末尾事件,每個(gè)事件都含有坐標(biāo)屬性。通過起止事件的相對(duì)位置,可以判斷是從左往右滑動(dòng)還是從右往左滑動(dòng)。 8 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 9 float velocityY) { 10 // TODO Auto-generated method stub 11 if (e1.getX() - e2.getX() > 50) { 12 Toast.makeText(MainActivity.this, "從右邊往左邊滑動(dòng)!", 0).show(); 13 14 } else if (e2.getX() - e1.getX() > 50) { 15 Toast.makeText(MainActivity.this, "從左邊往右邊滑動(dòng)!", 0).show(); 16 } 17 return super.onFling(e1, e2, velocityX, velocityY); 18 } 19 20 } 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.fragment_main); 26 imageView = (ImageView) findViewById(R.id.image); 27 myDetector = new GestureDetector(new myGestureListenner()); 28 imageView.setOnTouchListener(new OnTouchListener() { 29 30 @Override 31 public boolean onTouch(View v, MotionEvent event) { 32 // TODO Auto-generated method stub 33 // 捕獲觸摸屏幕的Event事件 34 myDetector.onTouchEvent(event); 35 36 return true; 37 } 38 }); 39 } 40 41 }
?
使用GestureOverlayView進(jìn)行手勢(shì)識(shí)別的步驟: 1. 使用Gesture Builder生成手勢(shì)文件 2. 將文件加入到項(xiàng)目 3. 在項(xiàng)目中創(chuàng)建 GestureOverlayView,將它放置在想要識(shí)別手勢(shì)的控件上,或者把它包裹起來。只能識(shí)別文件中存在的手勢(shì),如果不是文件中存在的手勢(shì),就無法識(shí)別。 --------------- 在res文件夾下創(chuàng)建文件夾raw,把手勢(shì)文件gesture添加到這里。 GestureOverlayView 一種用于手勢(shì)輸入的透明覆蓋層,可覆蓋在其他控件的上方,也可以包含其他控件。存在3個(gè)監(jiān)聽接口: GestureOverlayView.OnGestureListener // 手勢(shì)監(jiān)聽器 GestureOverlayView.OnGesturePerformedListener // 手勢(shì)執(zhí)行監(jiān)聽器 GestureOverlayView.OnGesturingListener // 手勢(shì)執(zhí)行中監(jiān)聽器 ------------------ 如圖使用GestureOverlayView控件去包含ImageView控件。 可識(shí)別手勢(shì)的區(qū)域大小不是由ImageView決定,而是由GestureOverlayView決定。 ------------------------ 補(bǔ)充: 使用Android Studio則更加簡(jiǎn)單,不用去創(chuàng)建 Simple Project。老師之所以要?jiǎng)?chuàng)建Simple Project,是因?yàn)槟M器中沒有Gesture Builder這種應(yīng)用,所以要自己創(chuàng)建。而Android Studio的模擬器是有Gesture Builder的,所以我們可以直接進(jìn)入模擬器,點(diǎn)擊Gesture Builder圖標(biāo),進(jìn)行手勢(shì)的創(chuàng)建。 給gestureOverlayView設(shè)置監(jiān)聽器: gestureOverlayView.addOnGesturePerformedListener(new OnGesturePerformedListener(){}) 重寫方法onGesturePerformed()。 如圖,onGesturePerformed()的示例代碼,也就是關(guān)于手勢(shì)識(shí)別的代碼實(shí)現(xiàn)。 ArrayList<Prediction>:預(yù)測(cè)集 predction.score:相似度,值越大,則越相似,也就是說你必須做出幾乎一模一樣的手勢(shì)才能通過識(shí)別。相似度的取值范圍一般是0.0~10.0,取10.0就已經(jīng)太夸張了,因?yàn)楹茈y做出非常接近的手勢(shì)。所以,這里的下限只取5.0: predction.score>=5.0 如果覺得顯示的手勢(shì)的軌跡不好看,可以自定義軌跡的樣式。 一些常見的XML屬性設(shè)置: Android:eventInterceptionEnabled 定義當(dāng)手勢(shì)已經(jīng)被識(shí)別出來時(shí),是否攔截該手勢(shì)動(dòng)作 Android:fadeDuration 當(dāng)用戶畫完的時(shí)候,手勢(shì)效果淡出的時(shí)間 Android:fadeEnabled 用戶畫完之后,手勢(shì)是否自動(dòng)淡出 Android:gestureColor 手勢(shì)的顏色 Android:gestureStrokeType 筆畫的類型 Android:gestureStrokeWidth 筆畫的粗細(xì) 1 public class MainActivity extends ActionBarActivity { 2 GestureOverlayView gestureOverlayView; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.fragment_main); 8 gestureOverlayView = (GestureOverlayView) findViewById(R.id.gestureOverlayView1); 9 // 1.找到預(yù)設(shè)定的手勢(shì)文件 10 // 2.加載那個(gè)手勢(shì)文件中的所有手勢(shì) 11 // 3.匹配,識(shí)別 12 13 // 從資源中將手勢(shì)庫文件加載進(jìn)來 14 final GestureLibrary library = GestureLibraries.fromRawResource( 15 MainActivity.this, R.raw.gestures); 16 library.load(); 17 gestureOverlayView 18 .addOnGesturePerformedListener(new OnGesturePerformedListener() { 19 20 @Override 21 public void onGesturePerformed(GestureOverlayView overlay, 22 Gesture gesture) { 23 // TODO Auto-generated method stub 24 // 讀出手勢(shì)庫中內(nèi)容 識(shí)別手勢(shì) 25 ArrayList<Prediction> mygesture = library 26 .recognize(gesture); 27 Prediction prediction = mygesture.get(0); 28 if (prediction.score >= 5.0) { 29 if (prediction.name.equals("exit")) { 30 finish(); 31 } 32 if (prediction.name.equals("next")) { 33 Toast.makeText(MainActivity.this, "下一首", 0) 34 .show(); 35 } 36 if (prediction.name.equals("previouse")) { 37 Toast.makeText(MainActivity.this, "上一首", 0) 38 .show(); 39 } 40 } else { 41 Toast.makeText(MainActivity.this, "沒有該手勢(shì)", 0) 42 .show(); 43 } 44 45 } 46 }); 47 48 } 49 50 }?
轉(zhuǎn)載于:https://www.cnblogs.com/my334420/p/6754432.html
總結(jié)
以上是生活随笔為你收集整理的Android攻城狮GestureDetector和GestureOverlayView的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue 单文件元件 — vTabs
- 下一篇: android sina oauth2.