2012-06-08 24 views
5

Estoy agregando imageviews al diseño principal dinámicamente. Y estoy realizando operaciones de acercamiento/alejamiento en Toque de imagen agregada. Quiero eliminar la vista agregada en LongPress de ella.onTouch, onLongHaga clic en 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; 

    } 
}; 

único toque eventos están trabajando. ¿Por qué? ¿Cómo puedo tener ambos? Donde Iiam va mal? ¿Qué debo hacer para eliminar la vista agregada? Por favor, ayúdame. Gracias por adelantado.

+0

has resuelto? – Siddhesh

+0

@Siddhesh siga mi [respuesta siguiente] (http://stackoverflow.com/a/41952363/4629101), se solucionará el problema. –

Respuesta

13

onTouch se llama siempre por su opinión ya que este es el estado inicial de enviar los eventos a la vista. Cuando presiona prolongadamente su vista, esto todavía llama al onTouch primero y desde que devuelve true en onTouch (lo que significa que ha consumido este evento y no debe enviarse más) no recibirá onLongPress llamado. ¿Qué va a hacer el truco es volver false en onTouch

+4

Pero luego 'onTouch' y' onLongPress' serán llamados. ¿Qué pasa si 'onLongPress' significa no llamar a' onTouch'? –

+0

@ LuisA.Florit: ¿encuentra alguna solución para esto? el mismo problema conmigo, tanto onTouch como onLongPress son llamados a la vez. – Tejas

+0

punto a tener en cuenta @luis A. Florit –

-2

Prueba esto, funciona muy bien para mí.

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

como se comenta por @asenovmEl onTouch() siempre se llama, ya que es el estado inicial de enviar los eventos a la vista, pero si volvemos valor falsa en onTouch() Entonces ambos funcionará como un encanto y el problema será resuelto.

Editar: Mi sugerencia para los usuarios es que en lugar de implementar OnLongClickListener() y OnTouch() juntos, trate de usar la función de OnLongClickListener() en doble clic evento.

Puede implementar doble clic en la siguiente forma:

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


    } 
}); 
Cuestiones relacionadas