2013-08-05 30 views
2

我在問這個相當複雜的問題,希望我能從你那裏得到一個想法。當使用onInterceptTouchEvent()時檢測觸摸事件

這裏的事情:我創建了一個自定義列表視圖類,上面的一個:

public class FolderListView extends ListView { 

    private float xDistance, yDistance, lastX, lastY; 
    private int folder_index; 
    private FolderViewInterface openFolder; 

    // private boolean swiping = false; 

    // If built programmatically 
    public FolderListView(Context context) { 
     super(context); 
    } 

    // This example uses this method since being built from XML 
    public FolderListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    // Build from XML layout 
    public FolderListView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 

     switch (ev.getAction()) { 

     case MotionEvent.ACTION_UP: 
      // if (swiping == false) { 

      //if (xDistance > yDistance) 
      // return false; 
     // else { 
       folder_index = pointToPosition((int) lastX, (int) lastY); 
      // Toast.makeText(getContext(), 
      //   "You pressed a folder with index: " + folder_index, 
      //   Toast.LENGTH_SHORT).show(); 
     // } 
      HomeScreenFragment f = new HomeScreenFragment(); 
      openFolder = (FolderViewInterface) f; 
      openFolder.onFolderOpened(folder_index); 
      // } 
      // swiping = false; 
      break; 

     case MotionEvent.ACTION_DOWN: 
      // swiping = false; 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      // swiping = true; 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) 
       return false; 
     } 

     return super.onInterceptTouchEvent(ev); 

    } 

} 

的事情是我在這裏尋找到正確檢測觸摸事件。 我想要觸摸打開其他片段,但現在片段在觸摸和滑動時都會打開。

我已經使用了onInterceptTouchEvent,因爲我的列表中的元素是viewpagers,並且它們在滾動時行爲不正常。

我需要某種邏輯在這裏檢測到刷卡,不執行此部分:

HomeScreenFragment f = new HomeScreenFragment(); 
      openFolder = (FolderViewInterface) f; 
      openFolder.onFolderOpened(folder_index); 

只有當事件是觸摸事件,而不是一個刷卡的。

任何類型的建議/幫助非常感謝,請讓我知道如果您需要任何更多的細節。

謝謝!

+0

爲什麼你不只是添加'onClickListener'到您的項目有何看法? – Desert

+0

試過,沒有工作... –

+0

你可以發佈你的嘗試代碼? – Desert

回答

2

我正在time 125基於PRESSED_STATE_DURATION

試試這個

//Declare as instance variables 
int oldX,oldY,newX,newY; 
//State the minimum distance of swipe that you forgive the user for ;) 
int distance = 10; 
int time = 125; 
boolean cancel = false; 
case MotionEvent.ACTION_DOWN: 
cancel = false; 
//Get x and y of touch 
oldX = ev.getX(); 
oldY = ev.getY(); 
startActionTimer(); 

case MotionEvent.ACTION_MOVE: 
//Get x and y of touch 
newX = ev.getX(); 
newY = ev.getY(); 

case MotionEvent.ACTION_UP: 
cancel = true; 

private void startActionTimer(){ 
     //time is pressed state duration 
      new CountDownTimer(time, time) { 
      public void onTick(long millisUntilFinished) {} 

      public void onFinish() { 
       //Time to do our action!!! 
       // please consider 
       if((Math.abs(newX - oldX)< distance) && (Math.abs(newY - oldY) <distance)){ 
        if(cancel == false){ 
        // Now its a touch so do your action 
        } 
       } 
      } 
      }.start(); 
    } 

注:請使用所有的變量爲類變量(實例變量),以避免出現問題。因爲有時我得到奇怪的情況下,不更新值正確

OR

你爲什麼不試試gesture detection

,並重寫onSingleTapUp方法

+0

我會嘗試你的方法,謝謝你的及時回覆 –

+0

嘿忘了添加'ACTION_UP ',所以只是編輯了代碼:) –

+0

對不起,這不適合我...我已經試過你的代碼,但我失去了我的初始功能這種方式:這是不是攔截列表滾動與尋呼機刷卡,所以現在滾動不允許傳呼機滑動...我需要一些基於我已經寫過的東西...但非常感謝您的提示,我會更多地關注您提出的建議。 –

0

如果您只需要在物品被觸摸時執行某些操作,則不需要自定義ListView,您只需在listView的適配器.setOnItemClickListener()上設置偵聽器。

+0

這就是事情,我需要做2件事:和一個被觸摸。滑動是由viewpager和兩個事件干涉,這是我的問題... –

+0

好吧,單擊將由該監聽器處理,如果你有刷卡的問題,那麼你應該看看'requestDisallowInterceptTouchEvent( )' – bogdan

+0

所以事情是滑動被viewpager的實現覆蓋並且正常工作。問題是這裏新的片段打開時,我刷卡,當我觸摸,我只需要它打開簡單的觸摸.... –

0

這裏是回答我的問題,我終於明白了。我只需要使用一個布爾變量來檢查什麼時候執行刷卡操作,並在不刷卡時執行相應的操作。它不是最好的解決方案,因爲它非常敏感(即使是輕微的滑動嘗試也是如此),但仍然是某種東西。

謝謝你們的幫助!

這裏是我更新的代碼:

package ro.gebs.captoom.utils; 

import ro.gebs.captoom.fragments.HomeScreenFragment; 
import ro.gebs.captoom.interfaces.FolderViewInterface; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.ListView; 

public class FolderListView extends ListView { 

    private float xDistance, yDistance, lastX, lastY; 
    private int folder_index; 
    private FolderViewInterface openFolder; 

    private boolean swiping = false; 

    // If built programmatically 
    public FolderListView(Context context) { 
     super(context); 
    } 

    // This example uses this method since being built from XML 
    public FolderListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    // Build from XML layout 
    public FolderListView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 

     switch (ev.getAction()) { 

     case MotionEvent.ACTION_UP: 
      folder_index = pointToPosition((int) lastX, (int) lastY); 
      if (!swiping) { 
       HomeScreenFragment f = new HomeScreenFragment(); 
       openFolder = (FolderViewInterface) f; 
       openFolder.onFolderOpened(folder_index); 
      } 
      swiping = false; 
      break; 

     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 

      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) { 
       swiping = true; 
       System.out.println("I AM HEREEEEEE"); 
       return false; 
      } 

     } 

     return super.onInterceptTouchEvent(ev); 

    } 

}