Estoy buscando una manera para que cuando un usuario toca un largo mapview (digamos para 1000ms) que puedo de alguna forma hacer una determinada acción.

¿Cómo puedo juzgar cuánto tiempo un usuario de larga toca un mapsview(o cualquier punto de vista).

Sería similar a la de android aplicación de google maps, cuando toque largo, trae un globo de superposición elemento.

Editar añadido

mapView.setOnLongClickListener(new View.OnLongClickListener() {

        public boolean onLongClick(View v) {

            Toast.makeText(mapView.getContext(), "Hello 123", 2000);
            return false;
        }
    });

el anterior no funciona… alguna idea de por qué?

Editar añadido

Esto es lo que estoy tratando en este momento, pero no parece funcionar, incluso si sólo pulse en el teléfono, se dice que el evento es una action_move,

estoy usando una clase interna en mi MapActivity

    private long startTime=0;
private long endTime=0;

class MapOverlay extends Overlay {



    @Override
    public boolean onTouchEvent(MotionEvent ev, MapView mapView) {

        if(ev.getAction() == MotionEvent.ACTION_DOWN){
             //record the start time
             startTime = ev.getEventTime();

             Log.d("LC", "IN DOWN");
          }else if(ev.getAction() == MotionEvent.ACTION_UP){
             //record the end time
             endTime = ev.getEventTime();
             Log.d("LC", "IN UP");
          }else if(ev.getAction() == MotionEvent.ACTION_MOVE){
              Log.d("LC", "IN move");
              endTime=0;
          }

          //verify
          if(endTime - startTime > 1000){
             //we have a 1000ms duration touch
             //propagate your own event
              Log.d("LC", "time touched greater than 1000ms");
              Toast.makeText(getBaseContext(), "Hello 123", Toast.LENGTH_SHORT).show();
              startTime=0; 
              endTime=0;
             return true; //notify that you handled this event (do not propagate)
          }

        return false;//propogate to enable drag

    }

}

y aquí está mi log de errores que no tiene ningún sentido para mí

06-29 14:29:55.509: DEBUG/LC(7693): IN move
06-29 14:29:56.149: DEBUG/LC(7693): IN UP
06-29 14:29:56.149: DEBUG/LC(7693): 6346707 6349261
06-29 14:29:56.149: DEBUG/LC(7693): time touched greater than 1000ms

el tiempo final debe estar a cero…pero no se…alguna idea de por qué?

Esto funcionó a la perfección! Aquí C#/Xamarin versión es alguien necesita: protected long _touchStartTime; public override bool OnTouchEvent(MotionEvent e){if (e.Action == MotionEventActions.Down) _touchStartTime = e.EventTime; if (e.Action == MotionEventActions.Up && e.EventTime - _touchStartTime > 1000) DoSomethingFun(); return base.OnTouchEvent(e);}
Hola, ¿de que usted averiguar cómo hacer la acción si el usuario presionó el botón durante cierto tiempo (digamos 1000ms) ?

OriginalEl autor molleman | 2011-06-29

5 Comentarios

  1. 7

    Esta es la forma en qué sueles crear un onLongClickListener. Intente esto:

    mapView.setOnLongClickListener(new OnLongClickListener() {
    
            @Override
            public boolean onLongClick(View arg0) {
    
                Toast.makeText(mapView.getContext(), "Hello 123", 2000);
    
                return false;
    
            }
        });

    De referencia para su edición:

    Este podría ser el camino para conseguir lo que quieres.

    private final Handler handler = new Handler();
    private final Runnable runnable = new Runnable() {
    public void run() {
         checkGlobalVariable();
    }
    };
    
    //Other init stuff etc...
    
    @Override
    public void onTouchEvent(MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN) {
        //Execute your Runnable after 1000 milliseconds = 1 second.
        handler.postDelayed(runnable, 1000);
        mBooleanIsPressed = true;
    }
    
    if(event.getAction() == MotionEvent.ACTION_UP) {
        if(mBooleanIsPressed) {
            mBooleanIsPressed = false;
            handler.removeCallbacks(runnable);
        }
    }
    }

    Y ahora se puede comprobar con checkGlobalVariable función:

    if(mBooleanIsPressed == true)

    Esto es cómo usted puede manejar este caso. La buena suerte.

    Supongo que Umitk darle forma correcta para la realización de larga haga clic en. Su código es exactamente cómo longClock obras en el original de Android vistas.

    OriginalEl autor Umitk

  2. 4

    Su son, probablemente en busca de una duración normal del clic?
    Usted tendrá que fijar su vista larga seleccionables mediante la adición de android:longClickable a sus puntos de vista xml, o llamando setLongClickable(true).
    A continuación, puede añadir un OnLongClickListener a la vista.
    No sé, de una manera de determinar exactamente el tiempo que el tiempo haga clic en. Pero el defecto de largo haga clic en es igual a la de google maps clic largo, que usted ha mencionado.

    OnLongClickListener

    editar añadido por encima de

    OriginalEl autor snowstreams

  3. 0

    Cuando MotionEvent.ACTION_UP, endTime se establece en ev.getEventTime(), esto hace que la configuración de endTime a cero cuando MotionEvent.ACTION_MOVE no afectan.
    En lugar de establecer endTime a cero, debe establecer startTime a ev.getEventTime()

    OriginalEl autor eleven

  4. 0

    Puede configurar un longClickListener y un touchListener. Agregar un valor booleano de la clase de datos de la variable de miembro de longClicked y se establece a false inicialmente. Esto es cómo usted puede establecer el longClickListener.

        view.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                longClicked = true;
                return false;
            }
        });

    Para touchListener

        view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(longClicked){
                    //Do whatever you want here!!
                    longClicked = false;
                }
                return false;
            }
        });

    Se le dará el mismo efecto como google maps largo haga clic en. Espero que ayude.

    OriginalEl autor Jeetendra Gan

Dejar respuesta

Please enter your comment!
Please enter your name here