Tengo una imagen, que se puede mover y escalar con gesto de pellizco. Todo esto se hace dentro de onTouch()
. Quiero restringir esto y hacerlo movible (y escalable) solo después de que el usuario haya hecho un clic largo en la imagen. ¿Cómo hago esto?Android: ¿Cómo llamar a Touch solo después de un onLongClick?
Respuesta
Registre LongCLickListener. Si se reconoce un clic largo, establezca un indicador en verdadero.
En el método OnTouch, permite escalar y mover solo si el indicador se establece en verdadero. Después de mover y escalar establecer la bandera a falso nuevamente.
Aquí es un poco de pseudocódigo:
public class MyActivity extends Activity {
private boolean longClick = false;
public boolean onTouch(View v, MotionEvent event) {
if (longClick) {
// do scaling and moving ...
longClick = false;
}
return false;
}
public boolean onLongClick(View v) {
longClick = true;
return false;
}
}
idea principal de Roflcoptr es correcto, pero incluso si usted se moverá el puntero sin pulsación larga, onLongClick se llamará. Para evitar esto, puede utilizar este código:
final int NONE=0;
final int DRAG=1;
final int LONG_PRESS=2;
int mode=NONE;
PointF start=new PointF();
public boolean onLongClick(View v) {
if(mode==NONE) mode=LONG_PRESS; //it helps to avoid unwanted onLongClick
return false;
}
public boolean onTouch(View v, MotionEvent event){
switch(event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
start.set(event.getX(),event.getY()); //point where we started from
break;
case MotionEvent.ACTION_UP:
mode=NONE;
break;
case MotionEvent.ACTION_MOVE:
if(mode==NONE && getDistance(event.getX(),event.getY(),start.x,start.y)>30d) mode=DRAG; //if we really move our pointer, then start the drag mode.
//it helps to avoid unwanted moving
if(mode==DRAG){
//do your stuff
}
if(mode==LONG_PRESS){
//do your stuff
}
break;
}
}
//returns distance between 2 points
private double getDistance(float x1,float y1,float x2,float y2){
float dx=Math.abs(x1-x2);
float dy=Math.abs(y1-y2);
return Math.sqrt(dx*dx+dy*dy);
}
esperan que ayude a alguien)
código brillante, me ayudó! Gracias un montón –
Se pueden crear dos View.ontouchlistener una para el trabajo y otro vacío, y establecer el oyente a ver sólo en onlongpress
LinearLayout.LayoutParams longpressLP = new LinearLayout.LayoutParams(100,100);
LinearLayout longpress = new LinearLayout(this);
longpress.setBackgroundColor(Color.GREEN);
mainlayout.addView(longpress,longpressLP);
final View.OnTouchListener buttontouch=new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction()==MotionEvent.ACTION_DOWN)
v.setOnTouchListener(buttontouchnone);
else
Toast.makeText(getApplicationContext(), "Touched", Toast.LENGTH_SHORT).show();
return false;
}
};
final View.OnTouchListener buttontouchnone=new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "None Touch", Toast.LENGTH_SHORT).show();
return false;
}
};
longpress.setOnTouchListener(buttontouch);
longpress.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "LongClick", Toast.LENGTH_SHORT).show();
v.setOnTouchListener(buttontouch);
return true;
}
});
- 1. Android: deshabilite la vibración predeterminada de OnLongClick
- 2. Android onTouch con onClick y onLongClick
- 3. ¿Cómo llamar a un método de C# solo si existe?
- 4. ¿Cómo llamar a una función * después de * onPreferenceChange?
- 5. ¿Cómo puedo llamar a un método dado solo su nombre?
- 6. Jquery Tools Touch horizontal solo desactivar vertical touch
- 7. Llamar a un evento después de cargar una pestaña jquery
- 8. Android Vibrate on touch?
- 9. Long Touch en un surfaceView (android)
- 10. Llamar a un script después de la validación con jquery.validate.unobtrusive
- 11. Cómo llamar a la función jquery después de llamar a wicket ajax botón de enviar
- 12. Cerrar un NetworkStream después de llamar a BeginRead() en C#
- 13. ¿Debo llamar a EndInvoke después de un tiempo de espera?
- 14. Inicialización de un puntero inmediatamente después de llamar a deleteLater()
- 15. ¿Cómo puedo llamar a getContentResolver en android?
- 16. ¿debo llamar a close() después de urllib.urlopen()?
- 17. Android - Volver a llamar Actividad
- 18. ¿Cómo llamar a JavaScript desde Android?
- 19. Sencha Touch 2 - Android Performance
- 20. Touch dos puntos de vista a la vez en android
- 21. Sencha Touch 2 android performance
- 22. ¿Cómo llamar a un servicio WCF usando ksoap2 en android?
- 23. Llamar a una función solo una vez
- 24. ¿Cómo llamar a un servicio web .NET desde android?
- 25. Android Touch Evento que determina la duración
- 26. Cómo llamar a una aplicación Android desde otra aplicación Android
- 27. Android: Llamar a la actividad de cultivo después de tomar la foto
- 28. cellForRowAtIndexPath no se llama a veces después de llamar a numberOfRowsInSection al llamar a reloadData
- 29. ViewPager OnLongClick oyente que no se activa
- 30. ¿Cómo llamar a un método después de que se terminó un Guión gráfico?
Im tratando de hacer esto en un ImageView. Entonces, ¿qué oyente le puse? onLongClick o onTouch? –
Ambos. En onLongClick, comprueba si un clic prolongado era anterior y en onTouch realiza su movimiento y escala como lo hace ahora. – RoflcoptrException
Sí, lo entiendo. Pero digamos que estoy implementando hacer clic para una 'vista de ImageView', ¿entonces debería escribir' view.setOnLongClickListener() '? y configurar mi clase para implementar 'onLongClickListener' y' onTouchListener'? –