2011-06-29 14 views
12

Szukam sposobu, w którym użytkownik długo dotyka widok mapy (powiedzmy na 1000ms), że mogę niektóre, jak wykonać określoną akcję.Jak określić długi dotyk na Androidzie?

W jaki sposób oceniać, jak długo użytkownik długo dotyka widoku mapy (lub dowolnego widoku).

Byłoby podobne do aplikacji mapy google na Androida, po długim dotyku wyświetla element nakładki balonu.

Edit dodane

mapView.setOnLongClickListener(new View.OnLongClickListener() { 

     public boolean onLongClick(View v) { 

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

powyższe nie działa ... jakieś pomysły dlaczego?

Edit dodane

To co próbuję w tej chwili, ale to nie wydaje się działać, nawet jeśli tylko nacisnąć przycisk na telefonie, to mówi, że wydarzenie to action_move,

ja używam wewnętrzną klasę w moim 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 

    } 

} 

i tu jest mój dziennik błędów, że nie ma sensu do mnie

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 

czas zakończenia powinien być ustawiony na zero ... ale to nie jest ... żaden pomysł, dlaczego?

+0

To działało idealnie! Oto wersja C#/Xamarin, której ktoś potrzebuje: 'protected long _touchStartTime; publiczny nadpisanie 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);} ' – BayssMekanique

Odpowiedz

4

Prawdopodobnie szukasz normalnego, długiego kliknięcia? Będziesz musiał ustawić swój widok tak, aby był długo klikalny przez dodanie android: longClickable do widoku xml lub przez wywołanie setLongClickable (true). Następnie możesz dodać OnLongClickListener do widoku. Nie wiem, w jaki sposób określić długość czasu kliknięcia. Ale domyślne długie kliknięcie jest takie samo, jak wspomniane długie kliknięcia w Google.

OnLongClickListener

+0

edycja dodana powyżej – molleman

1

użycie System.currentTimeMillis() zamiast ev.getEventTime();

0

Kiedy MotionEvent.ACTION_UP, endTime zostanie ustawiona na ev.getEventTime(), to make ustawienie endTime do zera, gdy MotionEvent.ACTION_MOVE się nie wpływać. Zamiast ustawiać endTime do zera, należy ustawić startTime do ev.getEventTime()

6

To jak ty normalnie utworzyć onLongClickListener. Spróbuj tego:

mapView.setOnLongClickListener(new OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View arg0) { 

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

      return false; 

     } 
    }); 

Odniesienie do edycji:

To może być sposób, aby uzyskać to, co chcesz.

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

I teraz można sprawdzić z funkcją checkGlobalVariable:

if(mBooleanIsPressed == true) 

ten sposób można obsługiwać tę sprawę. Powodzenia.

+1

@molleman Chyba ** Umitk ** daje właściwy sposób na realizację długiego kliknięcia. Jego kod to dokładnie jak działa longClock w oryginalnych widokach Androida. –

0

Można skonfigurować longClickListener i touchListener.Dodaj zmienną składnika danych typu boolean longClicked i początkowo ustaw ją na wartość false. W ten sposób możesz ustawić longClickListener.

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

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

To daje taki sam efekt jak mapy google długie kliknięcie. Mam nadzieję, że to pomoże.