最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android 控件同時監(jiān)聽單擊和雙擊實例

 更新時間:2020年08月21日 14:42:30   作者:那個游俠  
這篇文章主要介紹了android 控件同時監(jiān)聽單擊和雙擊實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

不適用click而用touch

自定義監(jiān)聽:

class myOnGestureListener extends GestureDetector.SimpleOnGestureListener {
 @Override
 public boolean onDoubleTap(MotionEvent e) {
  //點贊
  mLoadingListener.onFinishedLoading("0");//取消點贊 是一個接口
  //已經(jīng)點贊 更換圖片 1:已經(jīng)點贊 0 :沒有點贊
  if (likeType.equals("1")){
   String getLike = tvLike.getText().toString().trim();
   int iL = Integer.valueOf(getLike) - 1;
   tvLike.setText(String.valueOf(iL));
   mIvVideolike.setImageResource(R.mipmap.video_likegray);
   likeType = "0";
  }else {
   String getLike = tvLike.getText().toString().trim();
   int iL = Integer.valueOf(getLike) + 1;
   tvLike.setText(String.valueOf(iL));
   mIvVideolike.setImageResource(R.mipmap.video_xin_red);
   likeType = "1";
  }

  mRelTotal.addLoveView(e.getRawX(),e.getRawY());
  return super.onDoubleTap(e);
 }

 @Override
 public boolean onSingleTapConfirmed(MotionEvent e) {

  if (mOnVideoPlayerEventListener.isPlaying()){
   mOnVideoPlayerEventListener.pause();
   mIvVideoShow.setVisibility(VISIBLE);
  }else {
   mOnVideoPlayerEventListener.start();
   mIvVideoShow.setVisibility(GONE);
  }

  return super.onSingleTapConfirmed(e);
 }

}

使用:

myGestureDetector = new GestureDetector(mContext, new myOnGestureListener());

mRelTotal.setOnTouchListener(new View.OnTouchListener() {

 @Override//可以捕獲觸摸屏幕發(fā)生的Event事件
 public boolean onTouch(View v, MotionEvent event) {
  //使用GestureDetector轉發(fā)MotionEvent對象給OnGestureListener

  myGestureDetector.onTouchEvent(event);
  return true;
 }
});

補充知識:Android 利用GestureDetector處理不太常用的一些點擊事件

關于GestureDetector ,在網(wǎng)上有很多資料是描述如下常見情況下的回調(diào):

點擊一下非常快的(不滑動)Touchup:

onDown->onSingleTapUp->onSingleTapConfirmed

點擊一下稍微慢點的(不滑動)Touchup:

onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

長按:

onDown-->onShowPress-->onLongPress

兩次連續(xù)點擊(第二次點擊之后立即抬起):

(第一次點擊)onDown->onSingleTapUp->(第二次點擊)onDoubleTap->onDoubleTapEvent->onDown->onShowPress->onDoubleTapEvent

點擊之后滑動:

onDown->onShowPress->onScroll->......(->onFling)(視速度快慢)

但是這些并不能完美符合我們的需求,我們還會遇到以下需求:

雙擊之后拖動:

我在每個回調(diào)函數(shù)打上log,雙擊之后拖動的log如下:

(中間若干個都是onTouch: Move)

首先可以看到雙擊(onDoubleTapEvent)被回調(diào)之后的Move事件都被傳遞到了onDoubleTapEvent中。但是當你第二次點擊時間達到一定之后,onLongPress會被回調(diào),而當onLongPress被回調(diào)之后,MOVE動作就被GestureDetector無視了,直到UP動作出現(xiàn),顯然這不是我們想要的。

那么我們可以在onDoubleTapEvent中接收到Down動作時,利用setIsLongPressEnabled()使LongPress不會觸發(fā),然后在onDoubleTapEvent中接收到Up動作時再恢復即可。

 @Override
 public boolean onDoubleTapEvent(MotionEvent e) {
  Log.d(TAG, "onDoubleTapEvent: ");
  switch (e.getAction()) {
   case MotionEvent.ACTION_DOWN:
    gestureDetector.setIsLongpressEnabled(false);
    //action
    break;
   case MotionEvent.ACTION_MOVE:
    //action
    break;
   case MotionEvent.ACTION_UP:
    //action
    gestureDetector.setIsLongpressEnabled(true);
    break;
  }
  return true;
 }

更改之后,再進行測試,如下:

(中間若干個onTouch: Move,onDoubleTapEvent)

長按拖動:

在onLongPress被回調(diào)之后,GestureDetector不會對Move動作調(diào)用任何函數(shù),除非直到一個Up動作出現(xiàn),但用戶的習慣不可能是這樣。

因此對于這個需求我們需要在onTouch中對Move動作進行識別。

首先修改onLongPress函數(shù),在長按之后更新狀態(tài)為可拖拽,然后對onTouch中的Move動作我們自己調(diào)用onScroll(不一定要onScroll),并且在onScroll中完成動作,因此需要記錄上一次的MotionEvent:

 @Override
 public void onLongPress(MotionEvent e) {
  Log.d(TAG, "onLongPress: ");
  lastMotionEvent = e;
  draggable = true;
 }

然后在onTouch函數(shù)中:

 @Override
 public boolean onTouch(View v, MotionEvent event) {
  boolean result = gestureDetector.onTouchEvent(event);
  // 如果gestureDetector不消費動作
  if (!result) {
   switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
     break;
    case MotionEvent.ACTION_MOVE:
     // 可拖拽狀態(tài)下調(diào)用onScroll,同時更新lastMotionEvent
     if (draggable) {
      onScroll(lastMotionEvent, event, lastMotionEvent.getX() - event.getX(), lastMotionEvent.getY() - event.getY());
      lastMotionEvent = MotionEvent.obtain(event);
     }
     result = true;
     break;
    case MotionEvent.ACTION_UP:
     // 恢復為不可拖拽狀態(tài)
     if (draggable) {
      onScroll(lastMotionEvent, event, lastMotionEvent.getX() - event.getX(), lastMotionEvent.getY() - event.getY());
      lastMotionEvent = null;
      draggable = false;
     }
     result = true;
     break;
   }
  }
  return result;
 }

處理點擊-滑動之后的ACTION_UP

滑動的回調(diào)是這樣的

onDown->onShowPress->onScroll->......(->onFling)(視速度快慢)

如果onFling沒有被回調(diào)的話,我們無法對onScroll之后的Up動作響應,因此對于這個動作,我們也要在onTouch中處理。

首先要明確: 從點A滑動到點B,并且在點B松手的話,在沒有觸發(fā)onFling的情況下,會回調(diào)onScroll(eA, eB, distanceX, distanceY),然后GestureDetector不消費點B的Up事件,此時我們在onTouch中處理這個Up事件。

代碼也很簡單,在長按拖動的基礎上增加一個else即可:

    case MotionEvent.ACTION_UP:
     if (draggable) {
      onScroll(lastMotionEvent, event, lastMotionEvent.getX() - event.getX(), lastMotionEvent.getY() - event.getY());
      lastMotionEvent = null;
      draggable = false;
     } else {
      afterScroll(event);
     }
     result = true;
     break;

具體需要處理何種點擊事件可根據(jù)實際修改,希望分享的內(nèi)容能給你一點idea。

如果錯誤,請指出。

以上這篇android 控件同時監(jiān)聽單擊和雙擊實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Android實現(xiàn)讀取NFC卡的編號

    Android實現(xiàn)讀取NFC卡的編號

    這篇文章主要為大家詳細介紹了Android實現(xiàn)讀取NFC卡的編號,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android實現(xiàn)png轉jpg圖片的方法

    Android實現(xiàn)png轉jpg圖片的方法

    在 Android 應用開發(fā)中,圖像處理是非常常見的需求,本文介紹了如何在 Android平臺上實現(xiàn)一個 PNG 轉 JPG 的模塊,用戶可以從相冊或文件中選取 PNG 圖片,一鍵將其轉換為 JPG 并保存到本地,需要的朋友可以參考下
    2025-04-04
  • ListView的Adapter使用(綁定數(shù)據(jù)) 之 自定義每一項的布局去綁定數(shù)據(jù)

    ListView的Adapter使用(綁定數(shù)據(jù)) 之 自定義每一項的布局去綁定數(shù)據(jù)

    之前寫的綁定數(shù)據(jù)是只是簡單的綁定了字符串,這次我們將一次綁定多條數(shù)據(jù)并且嘗試用自定義的布局。在這篇文章中首先講解的是用Hashmap 去綁定數(shù)據(jù),第二個例子,講解自定義布局然后綁定數(shù)據(jù)
    2013-06-06
  • Android 4.0 設置全屏修改的解決方法

    Android 4.0 設置全屏修改的解決方法

    本篇文章是對Android 4.0 中設置全屏修改的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Android那兩個你碰不到但是很重要的類之ViewRootImpl

    Android那兩個你碰不到但是很重要的類之ViewRootImpl

    這兩個類就是ActivityThread和ViewRootImpl,之所以說碰不到是因為我們無法通過正常的方式引用這兩個類或者其類的對象,本文就嘗試從幾個我們經(jīng)常接觸的方面先談談ViewRootImpl,感興趣的可以參考閱讀下
    2023-05-05
  • 詳解Android中Room組件的使用

    詳解Android中Room組件的使用

    Room 是在 SQLite 上提供了一個抽象層,以便在充分利用 SQLite 的強大功能的同時,能夠流暢地訪問數(shù)據(jù)庫,這篇文章主要為大家介紹了Room組件的具體使用,需要的可以參考下
    2023-08-08
  • 關于android studio通過命令行運行gradle編譯命令的問題

    關于android studio通過命令行運行gradle編譯命令的問題

    這篇文章主要介紹了關于android studio通過命令行運行gradle編譯命令的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • 解析Android獲取系統(tǒng)cpu信息,內(nèi)存,版本,電量等信息的方法詳解

    解析Android獲取系統(tǒng)cpu信息,內(nèi)存,版本,電量等信息的方法詳解

    本篇文章對用Android獲取系統(tǒng)cpu信息,內(nèi)存,版本,電量等信息的方法進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • Android RecyclerView滾動定位

    Android RecyclerView滾動定位

    這篇文章主要為大家詳細介紹了Android RecyclerView滾動定位的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Kotlin協(xié)程Channel特點及使用細節(jié)詳解

    Kotlin協(xié)程Channel特點及使用細節(jié)詳解

    這篇文章主要為大家介紹了Kotlin協(xié)程Channel特點及使用細節(jié)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

兴隆县| 师宗县| 蓝田县| 凤庆县| 高清| 都江堰市| 西峡县| 汉阴县| 呼图壁县| 漾濞| 苍山县| 桃江县| 青阳县| 孟连| 页游| 郴州市| 南充市| 海淀区| 神农架林区| 霞浦县| 竹山县| 龙胜| 财经| 稷山县| 庆安县| 江华| 温泉县| 庆云县| 台中县| 清丰县| 毕节市| 香港 | 长阳| 诸暨市| 同江市| 青阳县| 鸡西市| 山阴县| 威海市| 弋阳县| 福海县|