2011-04-13 22 views
11

¿Cómo puedo escuchar los eventos de movimiento después de que LongPress esté marcado en mi GestureDetector?Mover eventos DESPUÉS de LongPress

Cuando el usuario LongClick inicia el modo de selección, y puede arrastrar un cuadrado en la pantalla. Pero noté que no se llama al onScroll después de consumir LongPress.

+0

Qué pasa con el evento '' onFling' de GestureDetector' - es invocado después de levantar el dedo arriba de presionar y mover? Alternativamente, también puede probar "raw" 'onTouchEvent' ... – Xion

+0

¿Está consumiendo LongPress? puede elegir aceptar el evento LongPress, pero luego devuelve falso, lo que permite que todo lo anterior controle el evento. También existe la opción de deshabilitar LongPress en la Vista cuando la atrape. –

+0

@ Dr.J desafortunadamente LongPress no se puede consumir. El método devuelve void, no boolean – Lukas

Respuesta

17

tratado de hacer combatir esto durante un tiempo, y por ahora la solución es:

  1. deshabilitar el LongPress usando setIsLongpressEnabled (isLongpressEnabled) en su gestureDetector

Aquí está mi método OnTouch de mi Ver:

public boolean onTouchEvent(MotionEvent event) { 
     if (mGestureDetector.onTouchEvent(event)== true) 
     { 
      //Fling or other gesture detected (not logpress because it is disabled) 
     } 
     else 
     { 
      //Manually handle the event. 
      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Remember the time and press position 
       Log.e("test","Action down"); 
      } 
      if (event.getAction() == MotionEvent.ACTION_MOVE) 
      { 
       //Check if user is actually longpressing, not slow-moving 
       // if current position differs much then press positon then discard whole thing 
       // If position change is minimal then after 0.5s that is a longpress. You can now process your other gestures 
       Log.e("test","Action move"); 
      } 
      if (event.getAction() == MotionEvent.ACTION_UP) 
      { 
       //Get the time and position and check what that was :) 
       Log.e("test","Action down"); 
      } 

     } 
     return true; 
    } 

Mi dispositivo devolvió ACTION_MOVE siempre que mantengo el dedo en la pantalla. Si no lo hace, simplemente verifique el estado de una bandera presionada después de 0.5s usando un temporizador o hilo.

Espero que ayude!

3

me han hecho esta tarea mediante el uso de los siguientes conceptos:

Supongamos que tengo la imagen de Visión y de pulsación larga en él, imagen dentro de esta imagen Vista sería arrastrar poder y se coloca dentro de la otra vista (por ejemplo, Diseño relativo) Establezca MyClickListner en el método setOnLongClickListener() de la Vista de imagen.

private final class MyClickListener implements View.OnLongClickListener { 

    // called when the item is long-clicked 
    @Override 
    public boolean onLongClick(View view) { 
     // TODO Auto-generated method stub 

     // create it from the object's tag 
     ClipData.Item item = new ClipData.Item((CharSequence)view.getTag()); 

     String[] mimeTypes = { ClipDescription.MIMETYPE_TEXT_PLAIN }; 
     ClipData data = new ClipData(view.getTag().toString(), mimeTypes, item); 
     View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 

     view.startDrag(data, //data to be dragged 
       shadowBuilder, //drag shadow 
       view, //local data about the drag and drop operation 
       0 //no needed flags 
     ); 
     // view.setVisibility(View.INVISIBLE); 
     return true; 
    } 
} 

asentando después MyDragListner en disposición relativa (por ejemplo bigImageRelativeLayoutVw.setOnDragListener (nueva MyDragListener());)

class MyDragListener implements View.OnDragListener { 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 

     int X=(int)event.getX(); 
     int Y=(int)event.getY(); 
     int touchX = 0,touchY=0; 
     // Handles each of the expected events 
     switch (event.getAction()) { 

      //signal for the start of a drag and drop operation. 
      case DragEvent.ACTION_DRAG_STARTED: 
       // do nothing 
       break; 

      //the drag point has entered the bounding box of the View 
      case DragEvent.ACTION_DRAG_ENTERED: 


       break; 

      //the user has moved the drag shadow outside the bounding box of the View 
      case DragEvent.ACTION_DRAG_EXITED: 
       // v.setBackground(normalShape); //change the shape of the view back to normal 
       break; 

      //drag shadow has been released,the drag point is within the bounding box of the View 
      case DragEvent.ACTION_DROP: 
       // if the view is the bottomlinear, we accept the drag item 
       if(v == bigImageRelativeLayoutVw) { 
        View view = (View) event.getLocalState(); 


        touchX=X-viewCoords[0]-20; 
        touchY=Y-viewCoords[1]-20; 


        View view1=new View(getActivity()); 
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(30,30); 

        layoutParams.leftMargin =touchX; 
        layoutParams.topMargin = touchY; 


        view1.setBackgroundResource(R.drawable.heavy_damage); 




        view1.setLayoutParams(layoutParams); 
        RelativeLayout containView = (RelativeLayout) v; 
        containView.addView(view1); 


        view.setVisibility(View.VISIBLE); 

       } else { 
        View view = (View) event.getLocalState(); 
        view.setVisibility(View.VISIBLE); 

        break; 
       } 
       break; 

      //the drag and drop operation has concluded. 
      case DragEvent.ACTION_DRAG_ENDED: 
       //  v.setBackground(normalShape); //go back to normal shape 

      default: 
       break; 
     } 
     return true; 
    } 
} 
Cuestiones relacionadas