2013-12-13 36 views
0

我嘗試中斷我爲ImageView聲明的setOnTouchListener。 重點是停止監聽器並對其進行一種「重置」,並且在我的ImaeView佈局上,當用戶手指接近屏幕頂部時。在移動事件期間中斷SetOnTouchListener

我的步驟是: - >創建OnTouchListener - >商店手指位置 - >如果手指靠近屏幕(100pixels)的頂部,重置ImageView的佈局爲默認的活動佈局xml文件,並中斷Listener。 - >要重複使用OnTouchListener,用戶必須放下手指。

我的代碼是這樣的:

private void readyDeck() { 
    // TODO Auto-generated method stub 
    backCard = (ImageView)findViewById(R.id.leader_backCardImg); 
    backCard.setVisibility(View.VISIBLE); 
    backCard.setAlpha(255); 
    backCard.setOnTouchListener(new OnTouchListener() { 


     @Override 
     public boolean onTouch(View v, MotionEvent me) { 


      int eid = me.getAction(); 
      switch(eid){ 
       case MotionEvent.ACTION_MOVE: 
        DisplayMetrics displaymetrics = new DisplayMetrics(); 
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
        int height = displaymetrics.heightPixels; 
        RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) backCard.getLayoutParams(); 
        int y = (int) me.getRawY(); 
        mParams.topMargin = y-height+(backCard.getHeight()/(1+(1/2))); 
        backCard.setLayoutParams(mParams); 
        int limit = backCard.getHeight(); 

        if(y > limit){ 
         mParams.topMargin = limit; 
         backCard.setLayoutParams(mParams); 
        } 

        else if(y < 255){ 
         backCard.setAlpha(y); 
         if(y < 100){ 

          backCard.setVisibility(View.GONE); 
          backCard.setOnTouchListener(null); 
          sendData(); 
          break; 
         } 

        } 

        break; 
       default: 
        break; 
      } 
      return true; 
     } 
    }); 

} 

的發送數據()方法重置聽衆,但如果我的代碼就像這樣:

public void sendData(){ 
    readyDeck(); 
} 

手指的位置總是存儲和使用即使我們沒有把它放在屏幕之外。

你可以看到它通過添加一些操作中的SendData()方法,如刪除一個ArrayList的一個隨機項,這裏的logcat的:

12-13 08:01:06.400: I/System.out(17171): s4 removed.New Size : 51 
12-13 08:01:06.460: I/System.out(17171): h6 removed.New Size : 50 
12-13 08:01:06.520: I/System.out(17171): h1 removed.New Size : 49 
12-13 08:01:06.560: I/System.out(17171): c1 removed.New Size : 48 
12-13 08:01:06.605: I/System.out(17171): hk removed.New Size : 47 
12-13 08:01:06.630: I/System.out(17171): d9 removed.New Size : 46 
12-13 08:01:06.655: I/System.out(17171): d2 removed.New Size : 45 
12-13 08:01:06.695: I/System.out(17171): h2 removed.New Size : 44 
12-13 08:01:06.730: I/System.out(17171): d8 removed.New Size : 43 
12-13 08:01:06.760: I/System.out(17171): s10 removed.New Size : 42 
12-13 08:01:06.800: I/System.out(17171): h7 removed.New Size : 41 
12-13 08:01:06.830: I/System.out(17171): d6 removed.New Size : 40 
12-13 08:01:06.850: I/System.out(17171): h9 removed.New Size : 39 
12-13 08:01:06.900: I/System.out(17171): s6 removed.New Size : 38 
12-13 08:01:07.250: I/System.out(17171): c4 removed.New Size : 37 
12-13 08:01:07.275: I/System.out(17171): d3 removed.New Size : 36 
12-13 08:01:07.300: I/System.out(17171): cv removed.New Size : 35 

我們可以看到,該方法不會停止監聽器,因爲在decalre之後它是空的,監聽器再次被加載了一個可以調用的OnTouch()。

你有一個方法來中斷偵聽器嗎?更重要的是,重置我的ImageView的佈局?謝謝 !

+0

你的問題很混亂..你能否重新說出它..一步一步地告訴你想要什麼和錯在哪裏? –

+0

我的步驟如下: - >創建OnTouchListener - >存儲手指位置 - >如果手指靠近屏幕的頂部(100像素),請在活動佈局xml文件中將ImageView的佈局重置爲默認值,並將中斷聽衆。 - >要重複使用OnTouchListener,用戶必須放下手指。 謝謝。 – mickaelb91

回答

0

我認爲如果您在調用sendData()時返回false,則應該阻止對當前觸摸事件進一步調用onTouch方法。從developer website

onTouch() - 這將返回一個布爾值來指示您的偵聽器是否消耗此事件。重要的是,這個事件可以有多個相互關聯的動作。因此,如果您在收到向下操作事件時返回false,則表示您沒有使用該事件,並且對此事件的後續操作也不感興趣。因此,您不會被要求在事件中執行任何其他操作,例如手指手勢或最終上行動作事件。

+0

我試過在調用sendData()之後返回false,而不是break;但它是一樣的。 – mickaelb91

+0

等我誤讀你的代碼了嗎?看起來你已經設置了一個無限循環。你可以調用onTouchListener的sendData(),它調用readyDeck(),它重新連接onTouchListener。所以下一次發生觸摸事件時,backCard會再次提取。實際上,請嘗試在您的onTouch底部返回false。 – GLee