<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          GestureDetector類及其用法

          作者: 時(shí)間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

          當(dāng)用戶觸摸屏幕的時(shí)候,會(huì)產(chǎn)生許多手勢(shì),例如down,up,scroll,filing等等。

          本文引用地址:http://www.ex-cimer.com/article/201610/305615.htm

          一般情況下,我們知道View類有個(gè)View.OnTouchListener內(nèi)部接口,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個(gè)方法太過簡(jiǎn)單,如果需要處理一些復(fù)雜的手勢(shì),用這個(gè)接口就會(huì)很麻煩(因?yàn)槲覀円约焊鶕?jù)用戶觸摸的軌跡去判斷是什么手勢(shì))。

          Android sdk給我們提供了GestureDetector(Gesture:手勢(shì)Detector:識(shí)別)類,通過這個(gè)類我們可以識(shí)別很多的手勢(shì),主要是通過他的onTouchEvent(event)方法完成了不同手勢(shì)的識(shí)別。雖然他能識(shí)別手勢(shì),但是不同的手勢(shì)要怎么處理,應(yīng)該是提供給程序員實(shí)現(xiàn)的。

          GestureDetector這個(gè)類對(duì)外提供了兩個(gè)接口:OnGestureListener,OnDoubleTapListener,還有一個(gè)內(nèi)部類SimpleOnGestureListener。

          GestureDetector.OnDoubleTapListener接口:用來通知DoubleTap事件,類似于鼠標(biāo)的雙擊事件。

          1,onDoubleTap(MotionEvent e):在雙擊的第二下,Touch down時(shí)觸發(fā) 。

          2,onDoubleTapEvent(MotionEvent e):通知DoubleTap手勢(shì)中的事件,包含down、up和move事件(這里指的是在雙擊之間發(fā)生的事件,例如在同一個(gè)地方雙擊會(huì)產(chǎn)生DoubleTap手勢(shì),而在DoubleTap手勢(shì)里面還會(huì)發(fā)生down和up事件,這兩個(gè)事件由該函數(shù)通知);雙擊的第二下Touch down和up都會(huì)觸發(fā),可用e.getAction()區(qū)分。

          3,onSingleTapConfirmed(MotionEvent e):用來判定該次點(diǎn)擊是SingleTap而不是DoubleTap,如果連續(xù)點(diǎn)擊兩次就是DoubleTap手勢(shì),如果只點(diǎn)擊一次,系統(tǒng)等待一段時(shí)間后沒有收到第二次點(diǎn)擊則判定該次點(diǎn)擊為SingleTap而不是DoubleTap,然后觸發(fā)SingleTapConfirmed事件。這個(gè)方法不同于onSingleTapUp,他是在GestureDetector確信用戶在第一次觸摸屏幕后,沒有緊跟著第二次觸摸屏幕,也就是不是“雙擊”的時(shí)候觸發(fā)

          GestureDetector.OnGestureListener接口:用來通知普通的手勢(shì)事件,該接口有如下六個(gè)回調(diào)函數(shù):

          1. onDown(MotionEvent e):down事件;

          2. onSingleTapUp(MotionEvent e):一次點(diǎn)擊up事件;在touch down后又沒有滑動(dòng)

          (onScroll),又沒有長按(onLongPress),然后Touchup時(shí)觸發(fā)。

          點(diǎn)擊一下非??斓?不滑動(dòng))Touchup:

          onDown->onSingleTapUp->onSingleTapConfirmed

          點(diǎn)擊一下稍微慢點(diǎn)的(不滑動(dòng))Touchup:

          onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

          3. onShowPress(MotionEvent e):down事件發(fā)生而move或則up還沒發(fā)生前觸發(fā)該

          事件;Touch了還沒有滑動(dòng)時(shí)觸發(fā)(與onDown,onLongPress)比較onDown只要Touch down一定立刻觸發(fā)。而Touchdown后過一會(huì)沒有滑動(dòng)先觸發(fā)onShowPress再是onLongPress。所以Touchdown后一直不滑動(dòng)

          按照onDown->onShowPress->onLongPress這個(gè)順序觸發(fā)。

          4. onLongPress(MotionEvent e):長按事件;Touch了不移動(dòng)一直Touch down時(shí)觸發(fā)

          5. onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑動(dòng)手

          勢(shì)事件;Touch了滑動(dòng)一點(diǎn)距離后,在ACTION_UP時(shí)才會(huì)觸發(fā)

          參數(shù):e1 第1個(gè)ACTION_DOWN MotionEvent 并且只有一個(gè);e2 最后一個(gè)ACTION_MOVE MotionEvent ;velocityX X軸上的移動(dòng)速度,像素/秒 ;velocityY Y軸上的移動(dòng)速度,像素/秒.觸發(fā)條件:X軸的坐標(biāo)位移大于FLING_MIN_DISTANCE,且移動(dòng)速度大于FLING_MIN_VELOCITY個(gè)像素/秒

          6. onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上

          拖動(dòng)事件。無論是用手拖動(dòng)view,或者是以拋的動(dòng)作滾動(dòng),都會(huì)多次觸發(fā),這個(gè)方法在ACTION_MOVE動(dòng)作發(fā)生時(shí)就會(huì)觸發(fā)

          拋:手指觸動(dòng)屏幕后,稍微滑動(dòng)后立即松開

          onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling

          拖動(dòng)

          onDown------》onScroll----》onScroll------》onFiling

          SimpleOnGestureListener類是GestureDetector提供給我們的一個(gè)更方便的響應(yīng)不同手勢(shì)的類,這個(gè)類實(shí)現(xiàn)了上述兩個(gè)接口(但是所有的方法體都是空的),該類是static class,也就是說它實(shí)際上是一個(gè)外部類。程序員可以在外部繼承這個(gè)類,重寫里面的手勢(shì)處理方法。

          方法步驟

          第一種示例:

          1,通過GestureDetector的構(gòu)造方法可以將SimpleOnGestureListener對(duì)象傳遞進(jìn)去,這樣GestureDetector能處理不同的手勢(shì)了。

          public GestureDetector

          (Context context, GestureDetector.OnGestureListener listener)

          2,在OnTouchListener的onTouch方法中

          private OnTouchListener gestureTouchListener = new OnTouchListener() {

          public boolean onTouch(View v, MotionEvent event) {

          return gDetector.onTouchEvent(event);

          }

          };

          第二種示例:

          使用方法

          private GestureDetector mGestureDetector;

          mGestureListener = new BookOnGestureListener();

          構(gòu)造出來mGestureDetector = new GestureDetector(mGestureListener);

          class BookOnGestureListener implements OnGestureListener {

          同時(shí)要public boolean onTouchEvent(MotionEvent event) {

          mGestureListener.onTouchEvent(event);

          }

          第三種示例代碼

          代碼:

          01.private GestureDetector mGestureDetector;

          02.@Override

          03.public void onCreate(Bundle savedInstanceState) {

          04. super.onCreate(savedInstanceState);

          05. mGestureDetector = new GestureDetector(this, new LearnGestureListener());

          06.}

          07.@Override

          08.public boolean onTouchEvent(MotionEvent event) {

          09. if (mGestureDetector.onTouchEvent(event))

          10. return true;


          上一頁 1 2 下一頁

          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();