Android控件拖動以及控件的onTouch事件與onClick事件的沖突問題

一:

原理就是響應控件的Touch事件予跌,在Touch事件中對移動進行處理籽暇,如果沒效果那你試著在布局文件中設置控件的 android:clickable="true"耘婚。
當然扯罐,大部分人都是直接想要解決方案,這里直接貼代碼肥照,后面會有一些說明脚仔。

  • 1.首先在 你的 Activity 實現(xiàn) OnTouchListener 接口 ,并重寫onTouch 方法

    implements OnTouchListener

  • 2.activity中定義幾個變量先

    private int screenWidth, screenHeight;
    private int lastX, lastY,moveDownX;
    private ImageView mTestIV;

  • 3.在Activity 的 onCreate方法中

      mTestIV=(ImageView) findViewById(R.id.iv_test); 
      mTestIV.setOnTouchListener(this);
      Display dis = this.getWindowManager().getDefaultDisplay();
      screenWidth = dis.getWidth();
      screenHeight = dis.getHeight();
    
  • 4.重寫onTouch內(nèi)部方法

    @Override
    public boolean onTouch(View v, MotionEvent event) {
      if (event.getAction() == MotionEvent.ACTION_DOWN) {
          lastX = (int) event.getRawX();
          lastY = (int) event.getRawY();
          moveDownX= (int) event.getRawX();
      }
      if (event.getAction() == MotionEvent.ACTION_MOVE){
    
          int dx = (int) event.getRawX() - lastX;
          int dy = (int) event.getRawY() - lastY;
    
          int top = v.getTop() + dy;
    
          int left = v.getLeft() + dx;
    
          if (top <= 0) {
              top = 0;
          }
          if (top >= screenHeight - mTestIV.getHeight()) {
              top = screenHeight - mTestIV.getHeight();
          }
          if (left >= screenWidth - mTestIV.getWidth()) {
              left = screenWidth - mTestIV.getWidth();
          }
          if (left <= 0) {
              left = 0;
          }
          v.layout(left, top, left + mTestIV.getWidth(), top + mTestIV.getHeight());
          lastX = (int) event.getRawX();
          lastY = (int) event.getRawY();
      }
      if (event.getAction() == MotionEvent.ACTION_UP) {
          int tempDX = (int) event.getRawX() - moveDownX;
          if (Math.abs(tempDX) < 6) {
              // do your things
              return false;// 距離較小舆绎,當作click事件來處理
          }
      }
      return true;// 返回true鲤脏,不執(zhí)行click事件
    }
    

以上為全部代碼。

二:

現(xiàn)在我們來分析下實現(xiàn)步驟:

一:我們開始要實現(xiàn)控件拖動效果

原理比較簡單:

  • 1.在按下的時候(MotionEvent.ACTION_DOWN)吕朵,開始記錄當前按下位置的坐標值猎醇;
  • 2.然后在手指移動控件的時候(MotionEvent.ACTION_MOVE),不斷計算當前的位置的坐標并重繪控件的位置

這里說明下 一些知識點:

視圖的left 努溃, top 硫嘶, right , bottom 的值是針對其父視圖的相對位置梧税,left相當于X軸值沦疾, top相當于Y軸值(原點為該widget 的父控件的左上角的點)
getX是獲取以widget左上角為坐標原點計算的X軸坐標值
getRawX 獲取的是以屏幕左上角為坐標原點計算的X軸坐標值

做完以上步驟,可以實現(xiàn)正常的拖動第队,但這時候會發(fā)現(xiàn)哮塞,你拖動抬起手指后會執(zhí)行onClick事件。
現(xiàn)在分析下這件事出現(xiàn)的原因:
在Android中凳谦,對一個View同時調(diào)用OnTouch事件和OnClick事件時忆畅,導致事件沖突。
比如onClick事件打算執(zhí)行A動作尸执,OnTouch事件打算執(zhí)行B動作邻眷,但是在實際使用時會發(fā)現(xiàn)眠屎,當調(diào)用OnTouch時,有可能會同時執(zhí)行A肆饶,B兩個動作改衩,這是因為OnClick事件本身就是在OnTouch事件中發(fā)生的;
在onTouch事件中驯镊,如果返回true葫督,就不會執(zhí)行onClick,返回false板惑,就同時執(zhí)行onClick方法橄镜,要想把OnTouch和onClick事件完全的區(qū)分》氤耍可能過下列方法洽胶,解決該沖突問題:  
就是在 OnTouch中的MotionEvent.ACTION_DOWN 時,記錄下點(X1裆馒,Y1)姊氓,在 MotionEvent.ACTION_UP 時,記錄下點(X2喷好,Y2)翔横,然后比對 倆點之間的距離,如果小于一個較小數(shù)值(比如6)梗搅,就認為是Click事件禾唁,onTouch中返回false,如果距離較大无切,可以當作onTouch事件去處理荡短,返回true:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哆键,隨后出現(xiàn)的幾起案子掘托,更是在濱河造成了極大的恐慌,老刑警劉巖洼哎,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烫映,死亡現(xiàn)場離奇詭異沼本,居然都是意外死亡噩峦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門抽兆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识补,“玉大人,你說我怎么就攤上這事辫红∑就浚” “怎么了祝辣?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長切油。 經(jīng)常有香客問我蝙斜,道長,這世上最難降的妖魔是什么澎胡? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任孕荠,我火速辦了婚禮,結(jié)果婚禮上攻谁,老公的妹妹穿的比我還像新娘稚伍。我一直安慰自己,他們只是感情好戚宦,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布个曙。 她就那樣靜靜地躺著,像睡著了一般受楼。 火紅的嫁衣襯著肌膚如雪垦搬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天那槽,我揣著相機與錄音悼沿,去河邊找鬼。 笑死骚灸,一個胖子當著我的面吹牛糟趾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甚牲,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼义郑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丈钙?” 一聲冷哼從身側(cè)響起非驮,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雏赦,沒想到半個月后劫笙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡星岗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年填大,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俏橘。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡允华,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靴寂,我是刑警寧澤磷蜀,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站百炬,受9級特大地震影響褐隆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剖踊,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一妓灌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜜宪,春花似錦虫埂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至澳窑,卻和暖如春斧散,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摊聋。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工鸡捐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麻裁。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓箍镜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煎源。 傳聞我的和親對象是個殘疾皇子色迂,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容