mit OnClickListener abfragen, wie lange ein Button gedrückt wird?

  • Ich weiß nicht ob diese Methode besser ist, bzw ich find sie besser


    Spoiler anzeigen

    Classe des TouchTimeListiner

    Java-Quellcode

    1. package tools.facebamm.baumert.daniel.de.tools;
    2. import android.view.MotionEvent;
    3. import android.view.View;
    4. /**
    5. * Created by DBaum on 24.03.2016.
    6. */
    7. public abstract class onTimeTouchListener implements View.OnTouchListener {
    8. private long sTime,eTime,mTime;
    9. //Implentierung
    10. public onTimeTouchListener()
    11. {
    12. sTime = 0;eTime = 0;mTime = 0;
    13. }
    14. //Registierung des Ontouchevents
    15. @Override
    16. public boolean onTouch(View v, MotionEvent event) {
    17. int Action = event.getAction();
    18. switch (Action)
    19. {
    20. case MotionEvent.ACTION_DOWN:
    21. Start();
    22. break;
    23. case MotionEvent.ACTION_UP:
    24. Stop();
    25. break;
    26. default:
    27. accTouch();
    28. break;
    29. }
    30. return false;
    31. }
    32. //Wiedergabe möglickeiten
    33. private void accTouch()
    34. {
    35. long accTime = System.nanoTime();
    36. mTime = accTime - sTime; // gibt die Acctuelle touch Zeit an
    37. }
    38. private void Start() {
    39. this.sTime = System.nanoTime();
    40. }
    41. private void Stop() {
    42. this.eTime = System.nanoTime();
    43. }
    44. public long getEndTime() {
    45. return eTime;
    46. }
    47. public long getStartTime() {
    48. return sTime;
    49. }
    50. public long getMaskeTime() {
    51. return mTime;
    52. }
    53. }
    Alles anzeigen




    Spoiler anzeigen

    Setzen des TouchTimeListener

    Java-Quellcode

    1. findViewById(R.id.toucher).setOnTouchListener(new onTimeTouchListener() {
    2. @Override
    3. public boolean onTouch(View v, MotionEvent event) {
    4. String Text = String.format("Start Zeit:%s\n" +
    5. "End Zeit:%s\n" +
    6. "Acc Zeit:%s", getStartTime(), getEndTime(), getMaskeTime());
    7. ((TextView)findViewById(R.id.textView)).setText(Text);
    8. return super.onTouch(v, event);
    9. }
    10. });
  • Danke für den übersichtlichen Code, denke mit vorkauen hat das noch nix zutun, zumindest nicht für nen Noob, versuch mich nun schon den dritten Tag ander Problemlösung und komme nicht weiter.
    Ohne solche Lichtblicke wie nachvollziehbare Codeschnipsel ist es schierunmöglich sich hier ein paar Grundkenntnisse anzugeignen, reines Googlen treibteinem hier zum Wahnsinn, vor allem wenn’s ohne Erfolg ist.

    Nun hab nun den neuen Code eingebaut und das mit den Zeiten funktioniert Tadellos,

    nur bin ich leider immer noch überfordert mit meine eingentlichem Problem mein View so lange zu verscheiben bis der Button losgelassen wird.

    Der Button wird ja bereits in einer anderen Farbe solage er gedrückt wird angezeit, kann man hier nix abgreifen ?

    wäre ein anderer Lösungsansetz für mein Problem eine Service-Klasse?

    schmeiß hier langsam das Handtuch und bau ein Osternest.
  • Mach dir ein WordDoc und notier die Code-Beispiele wie if anwendungen oder sowas ...

    Was du könntest das View in den onTimeTouchListener übergeben

    Java-Quellcode

    1. public .... (View ... v) {
    2. //Aufruf
    3. int index = 0 // Position des Items
    4. v[index]
    5. }


    dann machst du eine Funktion in der du es bei 'default' bewegst
    :D
    Und somit ungehst du das problem mit den UI-Block


    Für die Grundlagen ist die Seite ziehmlich gut, find ich tutorialspoint.com/android/index.htm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Facebamm ()

  • Hier der Aufruf:

    Quellcode

    1. if (v == findViewById(R.id.vor) && (me.getAction() == MotionEvent.ACTION_DOWN)) {
    2. //oben = oben - 5;
    3. wert = 1;
    4. new Thread(new Task()).start();
    5. else if (v == findViewById(R.id.vor) && (me.getAction() == MotionEvent.ACTION_UP)){
    6. wert = 0;
    7. spielStarten("vor", 0);
    8. }
    und hier der Handler

    Quellcode

    1. class Task implements Runnable {
    2. @Override
    3. public void run() {
    4. while(GameActivity.wert == 1){
    5. GameActivity.oben = GameActivity.oben - 5;
    6. try {
    7. Thread.sleep(100);
    8. } catch (InterruptedException e) {
    9. e.printStackTrace();
    10. }
    11. handler.post(new Runnable() {
    12. @Override
    13. public void run() {
    14. spielStarten("vor", 1);
    15. }
    16. });
    Alles anzeigen

    Aber was müsste ich ändern, damit der Handler auch aus der anderen Datei funktionieren würde ?
    Denn ein Thread funktioniert, solange er nicht auf die UI Elemente zugreift.
  • In onTouch kannst du mit z.B in Action_Down Anfangen die zeit zu stoppen und bei Action_Up aufhören. Wichtig ist das deine onTouch() Methode true zurückgibt, weil den Fehler hab ich mal gemacht wenn false zurückgegeben wird funktioniert das mit den events nicht !

    Hier mal Beispiel Code :


    Quellcode

    1. long timeStart;
    2. long timeEnd;
    3. longe time;
    4. @Override
    5. public boolean onTouch(View v, MotionEvent event) {
    6. switch (event.getAction()) {
    7. case MotionEvent.ACTION_UP:
    8. timeEnd = System.currentTimeMillis();
    9. time = timeEnd - timeStart; /*dass sind dann
    10. millisekunden wenn du Sekunden willst musst du /1000 machen*/
    11. break;
    12. case MotionEvent.ACTION_DOWN:
    13. timerStart = System.currentTimeMillis();
    14. break;
    15. case MotionEvent.ACTION_MOVE:
    16. //(wenn sich der Finger bewegen würde)
    17. break;
    18. }
    19. return true; //wichtig !! muss true sein.
    20. }
    Alles anzeigen
    Der long time ist dann die Zeit in Millisekunden wie lange der Knopf gedrückt wurde.
  • was macht ihr denn immer mit zeiten?
    für dieses problem braucht ihr keine zeiten.

    So wie ich das verstanden habe, will er einfach dass das auto losfährt wenn er den button drückt und stoppt wenn der button losgelassen wird. Dabei müsst ihr einfach nur in einem Switch case in einem OnTouchListener, abfragen ob der Callback mit action Down oder mit action Up aufgerufen wurde.

    PS: wenn ihr doch aus irgendeinem Grund zeiten braucht, könnt ihr ja innerhalb des case blocks die jeweiligen Zeiten mittracken, so wie ich es schon oben erklärt habe, und wie nic es gerade nochmal gepostet hat.