2011-04-19 9 views
24

Sorumum basit: Bir GestureListener uygularken onUp olayı nerede?GestureDetector'daki Onup olayı

İşaretleyicide çok fazla olayım var ve yalnızca dinleyicinin onUp olayını tüketemiyorum, çünkü olaylardan biri ona ihtiyaç duyan onSingleTapConfirmed.

+0

burada yapmak istediğim ne tamamen emin değilim, ama onSingleTapUp' G 'in' vardır estureListener', sizin aradığınız şey olabilir. Yine de, tam bir dokunuşla ateşlenir; Bunun için "ham" 'toTouchEvent''in/GestureDetector’a aktarmadan görüntü/etkinlik işleyebilirsiniz. Bir musluk bittiğinde, – Xion

+1

onSingleTapUp devreye girer. DOWN'a ihtiyacım var, sonra MOVE ve UP ile bit. –

+0

Bu "onFling", MOVE olaylarını almamanız dışında. Onlara ihtiyacınız varsa, tek seçeneğiniz 'onTouchEvent' ile doğrudan ilgilenmek olduğunu sanırım. – Xion

cevap

23

onFling()'u kullanmayı deneyin. Tuhaf bir isim gibi görünüyor ama benim için onUp() yönteminin mantıklı bir şekilde çalıştığı gibi çalışıyor. Ya da ben GestureListener

img.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) { 
     if (arg1.getAction() == MotionEvent.ACTION_UP 
      && !getDocument().isScaled()) 
     img.notifyUp(); 
     return gestures.onTouchEvent(arg1); 
    } 
}); 
+1

GestureListener'a geçmeden önce havalandırma değerini okuyarak çözerim (onFling mutlak faydasızdır) –

+0

Harika yanıt, sadece onFling'in tamamen işe yaramaz olmadığını eklemek istedim - kaydırma ve kaydırma arasında ayrım yapmanıza yardımcı olur. Parmağınızı kaldırdığınızı düşündüğünüzde sık sık bir kaçamak olsun, onFling işleyicisindeki hız parametrelerini kontrol ederek önemsiz olanları eleyebilirsiniz. –

+15

On bir tokatlama yaptığınızda OnFling olayı her zaman gerçekleşmez. En önemlisi, eğer parmağınızı kaydırırsanız, parmağınızı kaldırmadan önce parmağınızı hareket ettirmeyi bırakırsanız, genellikle bir olay olmaz. –

4

... Bu yöntemi denemek size GestureDetector.OnGestureListener içinde tüketmek diğer etkinliklerden gerçek döndü mı ? Bu problemi yaşadım ve eğer yanlış döndüyseniz ortaya çıkıyor, sistem ilgilenmediğinizi varsayar ve size olayları aktarmayı durdurur, bu yüzden siz de özlediniz!

2

iletecek önce Action event okuyarak düzelttim

@Override 
public boolean onTouchEvent(MotionEvent me) { 

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

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

Diğer cevaplar sorunu çözebilir, belki iyi çalışırlar, ancak bunların iyi çözümler olduğunu düşünmüyorum.
Bu olayı tek bir mucizeyle ele almalıyız, böylece kodu korumak veya genişletmek için daha kolay olabiliriz.

Yani, benim çözüm GestureDetector yeniden olduğunu (ekranda parmağınızı yavaş hareket arada, don değil, onFilng() işe yaramaz, onFilng() kullanın):

public class ModifyGestureDetector extends GestureDetector { 

    MyGestureListener myGestureListener; 

    public ModifyGestureDetector(Context context, OnGestureListener listener) { 
     super(context, listener); 
     init(listener); 
    } 

    void init(OnGestureListener listener){ 
     if (listener instanceof MyGestureListener){ 
      myGestureListener = (MyGestureListener) listener; 
     } 
    } 

    //u can write something more complex as long as u need 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     if(ev.getAction() == MotionEvent.ACTION_UP 
      && myGestureListener != null){ 
      myGestureListener.onUp(ev); 
     } 
     return super.onTouchEvent(ev); 
    } 

    public interface MyGestureListener{ 
     public void onUp(MotionEvent ev); 
    } 
} 

Ve dinleyici :

public class MyGestureListener extends GestureDetector.SimpleOnGestureListener 
     implements ModifyGestureDetector.MyGestureListener { 


    @Override 
    public void onUp(MotionEvent ev) { 
     //do what u want 
    } 
} 

:)