2012-06-08 16 views
5

Sto aggiungendo immagini dinamiche al layout principale in modo dinamico. E sto eseguendo operazioni di zoom in/out su Touch di immagine aggiunta. Voglio rimuovere la vista aggiunta suLongPress di esso.onTouch, onLongClick insieme 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; 

    } 
}; 

unico tocco eventi stanno lavorando. Perché? Come posso avere entrambi? Dove sto andando storto? Cosa devo fare per rimuovere la vista aggiunta? Mi aiuti per favore. Grazie in anticipo.

+0

hai risolto? – Siddhesh

+0

@Siddhesh segue la mia [sotto risposta] (http://stackoverflow.com/a/41952363/4629101), il problema verrà risolto. –

risposta

13

onTouch è sempre chiamato per la vista dal momento che questo è lo stato iniziale della spedizione delle manifestazioni per la vista. Quando si preme a lungo la visualizzazione, si chiama ancora onTouch e poiché si restituisce true in onTouch (che significa che si è consumato questo evento e non dovrebbe essere ulteriormente inviato) non si riceverà onLongPress chiamato. Che cosa farà il trucco sta restituendo false in onTouch

+4

Ma verranno chiamati entrambi 'onTouch' e' onLongPress'. Che dire se 'onLongPress' significa non chiamare' onTouch'? –

+0

@ LuisA.Florit: hai trovato qualche soluzione per questo? lo stesso problema con me, sia onTouch che onLongPress sono chiamati in un momento .. – Tejas

+0

punto da notare @luis A. Florit –

-2

Prova questo, funziona bene per me.

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

Come discusso da @asenovmL'onTouch() viene sempre chiamato in quanto è lo stato iniziale della spedizione delle manifestazioni alla vista, ma se ci ritorno valore falso in onTouch() Quindi entrambi funzionerà come un fascino e il problema verrà risolto.

Edit: Il mio suggerimento per gli utenti è che invece di attuazione OnLongClickListener() e OnTouch() insieme, provare a utilizzare la funzione di OnLongClickListener() in doppio clic evento.

È possibile implementare doppio clic in modi seguenti:

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(); 
    } 


    } 
}); 
Problemi correlati