2013-01-08 59 views
4

我對Android編程有點新,我最近把注意力轉向處理簡單的手勢。我知道GestureDetector和監聽器,並且我成功實現了我需要的簡單手勢(onDown,onFling,onScroll)。 問題是我需要在SimpleOnGestureListener類中不可用的onUp方法。 我有一個活動和一個自定義的視圖。該視圖並沒有真正做任何事情,只是改變背景顏色。我正在做活動中的所有事件處理。實現onUp事件處理程序使用SimpleOnGestureListener

我所嘗試的是在視圖的onTouchListener的onTouch方法中處理ACTION_UP事件,但這種方式onFLing不起作用。 我也在這裏閱讀有關解決方案:OnUp event on GestureDetector,其中說我應該覆蓋onTouchEvent但我不清楚哪些onTouchEvent應該覆蓋,在哪裏以及如何。 我插入我當前的代碼,也許它有幫助。 :)

public class Main extends Activity 
{ 
private GestureDetector gDetector; 
public CustomView cView; 
View.OnTouchListener gestureListener; 

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; 

public Vibrator vibrator; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    vibrator = (Vibrator)getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE); 
    gDetector=new GestureDetector(this, new gListener()); 
    gDetector.setIsLongpressEnabled(true); 
    gestureListener=new View.OnTouchListener(){ 

     public boolean onTouch(View v, MotionEvent event) 
     { 
      if(event.getAction()==MotionEvent.ACTION_UP) 
      { 
       cView.setBackgroundColor(Color.RED); 
       return true; 
      } 
      else 
      return gDetector.onTouchEvent(event); 
     } 
    }; 
    cView=new CustomView(this); 
    cView.setOnTouchListener(gestureListener); 
    cView.setBackgroundColor(Color.BLACK); 
    cView.setLongClickable(true); 
    setContentView(cView); 
} 

class gListener extends GestureDetector.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; 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       cView.setBackgroundColor(Color.WHITE); 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       cView.setBackgroundColor(Color.GRAY); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 

    @Override 
    public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
    { 
     vibrator.vibrate(30); 
     Log.d("Event", "MOVE"); 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) 
    { 
     cView.setBackgroundColor(Color.BLUE); 
     Log.d("Event", "DOWN"); 
     return true; 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) 
    { 
     Log.d("Event", "UP"); 
     return true; 
    } 

} 

}

+0

將在onFling還是工作,如果你''中返回onSingleTapUp FALSE'()'? –

回答

4

嘗試此方法...

@Override 
public boolean onTouchEvent(MotionEvent me) { 

Log.v("Touch", "ontouch: " + me.getAction()); 

if(me.getAction() == 0){ 
    Log.v("Touch Down", "Down"); 
} 
else if (me.getAction() == 1) { 
    Log.v("Touch Up", "Up"); 
} 
else if (me.getAction() == 2) { 
    Log.v("touch Scroll", "Scroll"); 
} 
boolean detectedUp = event.getAction() == MotionEvent.ACTION_UP; 
if (!mGestureDetector.onTouchEvent(event) && detectedUp) 
{ 
    return onUp(event); 
} 
return true; 
} 
+0

謝謝你,你的代碼工作,但我把它放在OnTouchListener的onTouch()方法。 :) – bala

+0

很高興:) – Gridtestmail

+2

使用常量而不是幻數:'me.getAction()== MotionEvent.ACTION_DOWN' – Peter