Kann nicht touch-Ereignis erkannt auf einen Blick und click-Ereignis erkannt, die in einer übergeordneten Ansicht
Habe ich ein layout "layout_base', dass den Bildschirm ausfüllt, und einer untergeordneten Ansicht "zu Hause".
Ich setze eine OnClickListener
auf die 'layout_base' einige Aktionen (schließen ein popup, wenn es geöffnet ist), und eine OnTouchListener
auf 'home' um einige der anderen Aktion (übersetzen auf schleudern).
Mein Problem ist, dass ich nur die Aktion gemacht, wenn ich zurück true
im onTouch
Methode der 'home' - touch-listener. Wenn ich zurück false
, onFling ist nicht genannt. Warum? Vom doc habe ich gelesen, dass dies nur bedeuten, dass das Ereignis konsumiert wird, also von meinem Verständnis, dass es nicht weitergegeben an andere Zuhörer.
Also:
- wenn ich zurück
true
imonTouch
,onFling
aufgerufen wird, aber dann das onClick-in den onClickListener, der die übergeordnete Sicht auf 'layout_base' wird nicht genannt. - wenn ich zurück
false
imonTouch
,onFling
wird nicht genannt, aber dann das onClick-in den onClickListener, der die übergeordnete Sicht auf 'layout_base' bezeichnet wird.
Wie bekomme ich meine beiden onFling Erkennung arbeiten auf 'home' und meine onClick-Erkennung arbeiten auf 'layout_base'?
Dank Sie
layout_base = findViewById(R.id.layout_base);
layout_base.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
closePopup(); //never called
}
});
contentGestureDetector = new GestureDetector(new ContentGestureListener());
contentGestureListener = new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
contentGestureDetector.onTouchEvent(event);
return true; //onFling only called if return true
}
};
home.setOnTouchListener(contentGestureListener);
class ContentGestureListener extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
final int SWIPE_MIN_DISTANCE = 120;
final int SWIPE_MAX_OFF_PATH = 250;
final int SWIPE_THRESHOLD_VELOCITY = 200;
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
if(e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if(!mMenuOpen){
mOpenMenuAnim.start();
mMenuOpen = true;
}
}
else if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if(mMenuOpen){
mCloseMenuAnim.start();
mMenuOpen = false;
}
}
return false;
}
}
InformationsquelleAutor jul | 2012-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
den
onTouch()
verbrauchen die Veranstaltung , sollten Sie in Ihrer MethodeonTouch()
, zurückfalse
anstelle von trueEDIT :
ändern Sie Ihre Methode onTouch() wie folgt :
Umsetzung der onTouch() der gestureDetector und gibt false zurück, auch
Ich habe bereits implementiert
onTouch()
, wo soll ich es umsetzen wieder?in Ihrem ContentGestureListener Klasse , und es wird false zurückgegeben
onTouch
ist nicht eine Methode derSimpleOnGestureListener
: developer.android.com/reference/android/view/..., Sie können mir zeigen einige code bitte?InformationsquelleAutor Houcine
Ich habe laufen über die gleiche Sache. Sie müssen true zurückgeben, in der onTouch-down-Ereignis zu erhalten, bewegen und up-Ereignisse (und machen gesten arbeiten). Dann müssen Sie implementieren eine der Funktionen hier die Rede zu machen, der rest arbeitet. Hoffe, das hilft.
InformationsquelleAutor cstrutton
Ich würde versuchen,
Durch Rückgabe von true, werden die Ereignisse in Richtung der layout_base wird abgebrochen und es wird kein onClick auftreten, wird es in diesem Fall.
InformationsquelleAutor Marc Van Daele