2012-06-08 13 views
5

Ich habe Bildansichten dynamisch zum übergeordneten Layout hinzugefügt. Und ich führe Zoom-In/Out-Operationen auf Touch des hinzugefügten Bildes durch. Ich möchte die hinzugefügte Ansicht auf LongPress davon entfernen.onTouch, onLongKlick zusammen in Android

img.setOnLongClickListener(longClickAction); 
img.setOnTouchListener(touchAction); 

onLongPress:

OnLongClickListener longClickAction = new OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View v) { 

     parentLayout.removeView((ImageView)v); 
     return false; 
    } 
}; 

OnTouch:

OnTouchListener touchAction = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     ImageView i = (ImageView)v; 

     //perfrom zoom operation on touch of imageview 
     zoom(i, event); 
     return true; 

    } 
}; 

Nur Touch-Ereignisse arbeiten. Warum? Wie kann ich beides haben? Wo ich falsch liege? Was muss ich tun, um die hinzugefügte Ansicht zu entfernen? Bitte hilf mir. Danke im Voraus.

+0

Sie es gelöst haben? – Siddhesh

+0

@Siddhesh folgen Sie meinem [unter Antwort] (http://Stackoverflow.com/a/41952363/4629101), das Problem wird gelöst. –

Antwort

13

onTouch immer für Ihre Ansicht Hilfe gerufen wird, da dies der Anfangszustand des Versands der Ereignisse in der Ansicht ist. Wenn Sie lange auf Ihre Ansicht drücken, ruft dies immer noch zuerst onTouch an, und da Sie true in onTouch zurückgeben (was bedeutet, dass Sie dieses Ereignis verbraucht haben und es nicht weiter versendet werden sollte), erhalten Sie onLongPress aufgerufen. Was macht den Trick ist die Rückkehr false in onTouch

+4

Aber dann werden 'onTouch' und' onLongPress' beide aufgerufen. Was ist, wenn 'onLongPress' bedeutet,' onTouch' nicht zu nennen? –

+0

@ LuisA.Florit: hast du irgendeine Lösung dafür gefunden? Das selbe Problem mit mir, sowohl onTouch als auch onLongPress werden gleichzeitig aufgerufen. – Tejas

+0

Punkt zu beachten @luis A. Florit –

-2

Versuchen Sie es, es funktioniert gut für mich.

boolean isMoving= false; 

yourView.setOnTouchListener(new View.OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      isMoving = true; 
      Log.i("isMoving:", "true"); 
     } 
     if(event.getAction()==MotionEvent.ACTION_UP){ 
      isMoving=false; 
      Log.i("isMoving:","false"); 
     } 
     return false; 
    } 
}); 
yourView.setOnLongClickListener(new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(View v) { 
     if(!isMoving){ 
      //do onlongclick event here 
     } 
     return true; 
    } 
});; 
1

Wie @asenovmDie OnTouch diskutiert() wird immer, wie es genannt der Versendung der Ereignisse in der Ansicht der Anfangszustand ist, aber wenn wir Wert zurückgeben falsch in OnTouch() beide dann wird wie ein Charme funktionieren und das Problem wird gelöst werden.

Edit: Mein Vorschlag für die Nutzer ist, dass anstelle der Umsetzung OnLongClickListener() und OnTouch() zusammen, versuchen, die Funktion von OnLongClickListener mit() in Klicken Sie doppelt Ereignis.

Sie Double Click in folgender Weise implementieren:

int i = 0; 
btn.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    i++; 
    Handler handler = new Handler(); 
    Runnable r = new Runnable() { 

     @Override 
     public void run() { 
      i = 0; 
     } 
    }; 

    if (i == 1) { 
     //Single click 
     handler.postDelayed(r, 250); 
    } else if (i == 2) { 
     //Double click 
     i = 0; 
     ShowDailog(); 
    } 


    } 
}); 
Verwandte Themen