2009-12-15 62 views
11

在我的應用我試圖捕捉視圖上一扔事件(ScrollView是準確的,但LinearLayout嘗試爲好)。安卓:檢測一扔手勢

通過設置斷點,我可以看到MotionEvents正確地發生,直到onFling()應該觸發的點。

的事件流程如下:

  1. 視圖的onTouchEvent
  2. OnGestureListener's onDown
  3. OnGestureListener's onShowPress
  4. OnGestureListener's onLongPress

我不知所措我如何繼續嘗試調試類似的東西,谷歌搜索不會轉向多了。任何指針?

我還附上應該處理的手勢有關的觀點:

import android.content.Context; 
import android.content.Intent; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.widget.ScrollView; 

public class GestureScrollView extends ScrollView { 
    private static int MAJOR_MOVE = 60; 
    private GestureDetector gd; 

    public GestureScrollView(final Context context) { 
     super(context); 
     gd = new GestureDetector(context, 
       new GestureDetector.OnGestureListener() { 

        @Override 
        public boolean onSingleTapUp(MotionEvent e) { 
         // TODO Auto-generated method stub 
         return false; 
        } 

        @Override 
        public void onShowPress(MotionEvent e) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
          float distanceY) { 
         // TODO Auto-generated method stub 
         return false; 
        } 

        @Override 
        public void onLongPress(MotionEvent e) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
          float velocityY) { 
         int dx = (int) (e2.getX() - e1.getX()); 
         if (Math.abs(dx) > MAJOR_MOVE 
           && Math.abs(velocityX) > Math.abs(velocityY)) { 
          if (velocityX < 0) { 
           Intent intent = new Intent(context, Main.class); 
           context.startActivity(intent); 
          } 
         } 
         return false; 
        } 

        @Override 
        public boolean onDown(MotionEvent e) { 
         // TODO Auto-generated method stub 
         return false; 
        } 
       }); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return gd.onTouchEvent(event); 
    } 
} 

回答

2

從活動從您的視圖下的MotionEvent沒有。當你的姿態探測器是基於MotionEvent是來自活動您將獲得onFling事件。所以,你必須從你的GestureScrollView移動的onTouchEvent()到您的Activity類。 關心!

+2

感謝您抽出寶貴時間來回答。實際上它比這更復雜。 Android的Event冒泡機制有點奇怪。 什麼解決了這個問題對我來說是越來越的onTouchEvent()總是返回true,像這樣: @覆蓋 公共布爾的onTouchEvent(MotionEvent事件){ gd.onTouchEvent(事件); 返回true; } 並添加一個額外的方法: @覆蓋 公共布爾onInterceptTouchEvent(MotionEvent EV){ \t回gd.onTouchEvent(EV); } 問候。 – javito 2009-12-20 11:16:47

+0

@javito你不能張貼您正確的代碼作爲一個答案,請 - 那種沒有很好地對你的問題記錄 – Elemental 2011-05-31 21:58:08

+0

@javito +1搞清楚這一個一個棘手的情況。它幫助我從我的滾動視圖中竊取活動 – 2011-12-01 21:14:22