2011-05-12 177 views
2

我實現onFling探測器很像以下問題: Fling gesture detection on grid layout麻煩與onFling和SimpleOnGestureListener

不過,我只是無法得到它的工作。 (?也許是的AsyncTask)

如果一些方法,我已經建立了我的應用程序引起此問題,這是我的應用程序是如何構成的:

(試圖使之成爲一個很好的格式化的列表,但它擰在下面的代碼出於某種原因嗎?)

--MapActivity創建一個MapView。

--MapView創建一個ASyncTask來從URL中獲取XML。

所述的AsyncTask的--onPostExecute()解析XML,並增加了使用數據的ItemizedOverlay取出

--onTap()的ItemizedOverlay的功能獲取使用LoaderImageView(http://www.anddev.org/novice-tutorials-f8/imageview-with-loading-spinner-t49439.html

從web的圖像然後 --onTap()函數調用下面

列出的PopupPanel類的節目()函數正如你可以從下面的代碼中看到,註釋掉線工作。但是,與MyGestureDetector類一起使用時,onTouch和onFling事件絕不會被命中。

class PopupPanel { 
    View popup; 
    boolean isVisible = false; 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
    private GestureDetector gestureDetector; 
    public View.OnTouchListener gestureListener; 

    PopupPanel(Context context, int layout) { 
     ViewGroup parent = (ViewGroup) map.getParent(); 

     popup = ((MapActivity) context).getLayoutInflater().inflate(layout, parent, false); 

     SelectFilterActivity selectFilterActivity = new SelectFilterActivity(); 
     popup.setOnClickListener(selectFilterActivity); 

// This works! 
//   popup.setOnTouchListener(new View.OnTouchListener() { 
//    public boolean onTouch(View v, MotionEvent event) { 
//     Toast.makeText(map.getContext(), "Touched", Toast.LENGTH_SHORT).show(); 
//     return false; 
//    } 
//   }); 

     // Gesture detection 
     gestureDetector = new GestureDetector(new MyGestureDetector()); 
     gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }; 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      try { 
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false; 
       // right to left swipe 
       if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Toast.makeText(map.getContext(), "Left Swipe", Toast.LENGTH_SHORT).show(); 
       } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Toast.makeText(map.getContext(), "Right Swipe", Toast.LENGTH_SHORT).show(); 
       } 
      } catch (Exception e) { 
       // nothing 
      } 
      return false; 
     } 

     @Override 
     public boolean onDown(MotionEvent e) { 
      return true; 
     } 
    } 

    View getView() { 
     return (popup); 
    } 

    void show(boolean alignTop) { 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 

     if (alignTop) { 
      lp.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
      lp.setMargins(0, 20, 0, 0); 
     } else { 
      lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
      lp.setMargins(0, 0, 0, 60); 
     } 

     hide(); 

     ((ViewGroup) map.getParent()).addView(popup, lp); 
     isVisible = true; 
    } 

    void hide() { 
     if (isVisible) { 
      isVisible = false; 
      ((ViewGroup) popup.getParent()).removeView(popup); 
     } 
    } 
} 

回答

1

我不是100%肯定,如果這是什麼原因,但我沒有看到你的gestureListener代碼調用View.setOnTouchListener。我會預計線路;

setOnTouchListener(gestureListener) 

創建它之後。

+0

我其實是試圖在一個不同的文件中的類中實現它。由於某種原因,這不起作用,所以我將它移到與彈出窗口相同的文件中。忘了在構造函數的末尾添加'popup.setOnTouchListener(gestureListener);'。現在我已經這樣做了,一切正常。謝謝。我歸因於我需要去睡覺。 =) – 2011-05-12 06:13:41

8

嘗試從MyGestureDetector.onDown返回true。超類的實現是返回false,然後抑制未來事件的傳遞,直到觸摸被釋放。