1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Button gedrückt halten -> Werte ändern sich

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Arno, 13.03.2011.

  1. Arno, 13.03.2011 #1
    Arno

    Arno Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    07.01.2011
    Phone:
    HTC Desire HD
    Hi!

    Ich hab mal wieder ein Problem. Ich möchte über Buttons Werte verändern. Leider kann ich das nur in kleinen Schritten über eine insgesamt große Strecke. Was ich bräuchte wäre, dass man den Button gedrückt hält und sich die Werte weiter verändern. Schön wäre noch, dass sich die Werte anfangs langsam ändern und dann immer schneller.
    Hab vergeblich gegoogelt :(

    Jmd ne Idee?

    Gruß,
    Arno.
     
  2. SeraphimSerapis, 13.03.2011 #2
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    Hi Arno,
    dafür könntest Du verschiedene Implementierungen wie zB eine while-Schleife in einem onTouch-Event nutzen.

    Dann prüfst Du einfach bei jeder Iteration ob noch gehalten wird und falls ja, inkrementierst Du deinen Wert. Das Ganze könnte zB durch sleep etwas gemildert werden.

    BTW: Nicht gut genug gegoogelt: http://stackoverflow.com/questions/...g-button-press-to-increment-decrement-counter

    LG
     
    Arno bedankt sich.
  3. Arno, 13.03.2011 #3
    Arno

    Arno Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    07.01.2011
    Phone:
    HTC Desire HD
    Jo vielen dank, das haut schonmal soweit hin, dass man den Button nicht mehr "klickt" sondern nur berührt sozusagen bzw ich habe jetzt halt ein onTouch statt eines onClicks.
    Mein Problem jetzt: ich möchte, dass die While-Schleife solange durchlaufen wird wie gedrückt ist. Ich habe alles mögliche überlegt, gelesen und probiert aber vllt. bin ich einfach zu blöd oder seh den Wald vor lauter Bäumen nich.

    Mein Code ist folgender:
    Code:
         plus.setOnTouchListener(new OnTouchListener(){
         public boolean onTouch(View v, MotionEvent event){
            	switch (event.getAction()) {
            	case MotionEvent.ACTION_DOWN: {
            		while (event.getAction() != MotionEvent.ACTION_UP)
            		{
             	             p = p + 1;
            	             text1.setText(p+" %");
            		}
    
    Das funktioniert leider nicht. Mit event.getAction() == MotionEvent.ACTION_DOWN hab ichs auch schon versucht
    Ich probier mal weiter, hoffe es hat vllt. einer ne Lösung..

    Gruß,
    Arno.
     
    Zuletzt bearbeitet: 13.03.2011
  4. Arno, 14.03.2011 #4
    Arno

    Arno Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    07.01.2011
    Phone:
    HTC Desire HD
    Also ich habe jetzt alle erdenklichen Arten von Schleifen und Abfragen getestet inkl eigener Boolschen Variablen

    while event.getActionMasked() == MotionEvent.ACTION_DOWN oder UP geht nicht (natürlich auch != nicht) wenn ich die Schleife in einen externe Funktion setze geht es auch nicht. Wenn ich bei DOWN x.setText("DOWN") und bei UP x.setTest("UP") setze wechselt er fröhlich hin und her also prinzipiell geht es aber meine Schleifen funktionieren nicht.

    Prinzipiell müssen Schleifen wohl gehen, sonst hättest du mir den Tipp nicht geschrieben aber ich komme hier absolut nicht weiter (natürlich hab ich auch weiter ausführlich gegugelt und bei anderen android-communities und hier gesucht und nichts gefunden)

    HILFE! :(
     
  5. Fr4gg0r, 14.03.2011 #5
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Dein Beispielcode kann nicht funktionieren, da dort immer wieder dasselbe MotionEvent befragt wird.
    Sollte somit einmal der Screen berührt werden, läuft die Schleife für immer.

    Du brauchst einen Flag, der dir sagt ob der Screen gedrückt ist..desweiteren wirst du dann die Schleife vermutlich in einen neuen Thread auslagern müssen, denn wenn dein Main Thread mit solch einer Schleife belegst, kann das System logischerweise dein onTouch nicht aufrufen.

    Code:
    boolean down = false;
    Handler handler;
    Runnable incrementRunnable = new Runnable(){
       public void run(){
             text.setText(counter);
             counter++;
             if(down)handler.postDelayed(this, 100);
       }
    }
    onTouch(MotionEvent e){
    if(action == ACTION_DOWN)handler.post(incrementRunnable);
    if(action == ACTIONUP)down = false;
    }
    
    Das Beispiel ist zwar ohne sichtbaren 2ten Thread, müsste aber funktionieren. Wichtig ist, dann
    down in onStop() auf false zu setzen, denn sonst dürfte der munter weiter cpu belegen, selbst wenn du wieder auf dem
    homescreen bist.
     
    Zuletzt bearbeitet: 14.03.2011
  6. ghost-ccc, 26.04.2012 #6
    ghost-ccc

    ghost-ccc Android-Hilfe.de Mitglied

    Beiträge:
    73
    Erhaltene Danke:
    5
    Registriert seit:
    28.03.2012
    Phone:
    HTC Sensation
    hi ich brauch mal eure hilfe ich wollte einem Button einen 30 sekunden langen sound zu weisen und den durch einen onTouchListener Action_DOWN/Ation_UP abspielen
    Also das heist wenn ich den Button drücke und gedrückt halte dann soll der sound aus gegeben werden
    so bald ich den Button wieder los lasse soll er den sound stoppen
    wenn ich den Button wiederholt drücke soll er den sound wieder von anfang an ab spielen
    oder wäre der OnLongClickListener dafür besser geeignet
    bin leider noch totaler anfänger und wäre euch sehr dank bar für eure hilfe sitze jetzt schon seit anfang letzter woche nur an diesem blöden button :(
    achso den button hab ich im moment mit einem onClickListener schon einen sound zu gewiesen der auch läuft leider nur nicht mit den oben genanten Problem
     
    Zuletzt bearbeitet: 26.04.2012
  7. Tom299, 27.04.2012 #7
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Dann nimm doch den OnTouchListener, bei ACTION_DOWN startest du deinen Sound-Thread und bei ACTION_UP oder ACTION_CANCEL beendest du ihn. Das sollte eigentlich viel einfacher sein als das oben beschriebene Problem.
     
    ghost-ccc bedankt sich.
  8. ghost-ccc, 27.04.2012 #8
    ghost-ccc

    ghost-ccc Android-Hilfe.de Mitglied

    Beiträge:
    73
    Erhaltene Danke:
    5
    Registriert seit:
    28.03.2012
    Phone:
    HTC Sensation
    ok danke erstmal für deine antwort
    das problem ist nur ich weis nicht wie ich den button dieses zu weise bei dem onClickListener ist das ja kein problem
    hier mal mein code
    Code:
    package de.GitarXXL.GC;
    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
     
    public class Gitarthree extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.gitar3);
     
      //Button Sound
      final MediaPlayer buttonSound1 = MediaPlayer.create(Gitarthree.this, R.raw.gitar1start);
     
      //Button Settings 
      Button Gitar1 = (Button) findViewById(R.id.g1);
      Gitar1.setOnTouchListener(new View.OnTouchListener() {
     
       public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        switch(event.getAction()){
        case MotionEvent.ACTION_DOWN:
     
         break;
        case MotionEvent.ACTION_CANCEL:
     
         break;
        }
        return true;
       }
     
      }};
     
     }
     
     
     @Override
     protected void onPause() {
      // TODO Auto-generated method stub
      super.onPause();
     }
     
     
    }
     
     
    
     
    Zuletzt bearbeitet: 27.04.2012
  9. Tom299, 27.04.2012 #9
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    das sieht doch richtig aus, soweit ich sehe. jetzt einfach noch den sound da drin starten und stoppen (ich glaub du mußt nen thread nehmen oder ist MediaPlayer schon ein thread?)
     
    ghost-ccc bedankt sich.
  10. ghost-ccc, 27.04.2012 #10
    ghost-ccc

    ghost-ccc Android-Hilfe.de Mitglied

    Beiträge:
    73
    Erhaltene Danke:
    5
    Registriert seit:
    28.03.2012
    Phone:
    HTC Sensation
    hm meinst so stoppen oder anders hab leider auch noch 2 rote x weiter unten
    wegen dem thread mus ich noch mal schauen ich weis gerade nicht was das noch mal genau war
    Code:
    [SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]
    [LEFT]//Button Sound[/LEFT]
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][LEFT][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]final[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] MediaPlayer buttonSound1 = MediaPlayer.[I]create[/I](Gitarthree.[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]this[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], R.raw.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]gitar1start[/I][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]);
    
    [/SIZE][SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]//Button Settings [/LEFT]
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][LEFT]Button Gitar1 = (Button) findViewById(R.id.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]g1[/I][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]);
    Gitar1.setOnTouchListener([/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] View.OnTouchListener() {
    
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]boolean[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] onTouch(View v, MotionEvent event) {
    [/SIZE][SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]// [/COLOR][/SIZE][/COLOR][/SIZE][B][SIZE=2][COLOR=#7f9fbf][SIZE=2][COLOR=#7f9fbf]TODO[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f] Auto-generated method stub[/LEFT]
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][LEFT]buttonSound1.start();
    buttonSound1.stop();
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]switch[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2](event.getAction()){
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]case[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] MotionEvent.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]ACTION_DOWN[/I][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]:
    
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]break[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]case[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] MotionEvent.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]ACTION_CANCEL[/I][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]:
    
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]break[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];
    }
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]return[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]true[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];
    }
    
    [U]}[/U]};[U]hier[/U] [/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]bekomme[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [U]ich[/U] auch [U]noch[/U] [U]ein[/U] [U]rotes[/U] [/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]x[/LEFT]
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][LEFT]
    [U]}und[/U] [/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]hier[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [U]auch[/LEFT]
    [/U][/SIZE]
     
  11. Tom299, 27.04.2012 #11
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    du mußt das starten und stoppen natürlich in die case-anweisung machen:

    Code:
    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
       buttonSound1.start();
    break;
    case MotionEvent.ACTION_CANCEL:
       buttonSound1.stop();
    break;
    case MotionEvent.ACTION_UP:
       buttonSound1.stop();
    break;
    
     
    ghost-ccc bedankt sich.
  12. ghost-ccc, 27.04.2012 #12
    ghost-ccc

    ghost-ccc Android-Hilfe.de Mitglied

    Beiträge:
    73
    Erhaltene Danke:
    5
    Registriert seit:
    28.03.2012
    Phone:
    HTC Sensation
    hm ja hast recht is ja logisch jetzt hab ich halt leider noch zwei rote x am ende
    ich mach die classe am besten noch mal neu
    muss ich ein
    protected
    void onPause() { ganz unten lassen oder kann ich den raus schmeisen
     
  13. Tom299, 27.04.2012 #13
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    das mit den roten X kann ich leider nicht beurteilen, da können Klammern fehlen oder zu viel sein, Strichpunkte vergessen ... das mußt du selbst rausfinden ;-)
     
    ghost-ccc bedankt sich.
  14. ghost-ccc, 27.04.2012 #14
    ghost-ccc

    ghost-ccc Android-Hilfe.de Mitglied

    Beiträge:
    73
    Erhaltene Danke:
    5
    Registriert seit:
    28.03.2012
    Phone:
    HTC Sensation
    danke geht jetzt fast so wie ich es will also sound wird bei gedrücktem button ab gespielt und wenn ich ihn los lasse stopt er
    jetzt hab ich leider noch das problem das er den sound nicht noch mal wieder gibt
    kannst du mir noch mal einen tip geben wie ich den button immer wieder drücken kann und er mir den sound wieder gibt ?
    hier mit geht es auch nicht
    break;
    case MotionEvent.ACTION_UP:
    buttonSound1.reset();
     
    Zuletzt bearbeitet: 27.04.2012
  15. Tom299, 27.04.2012 #15
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
  16. ghost-ccc, 27.04.2012 #16
    ghost-ccc

    ghost-ccc Android-Hilfe.de Mitglied

    Beiträge:
    73
    Erhaltene Danke:
    5
    Registriert seit:
    28.03.2012
    Phone:
    HTC Sensation
    hm danke noch mal das du dir sogar die zeit nimmst mir was raus zu suchen leider mus ich zu geben das mein englisch echt schlecht ist
    das mit dem prepare einfach davor setzen geht leider nicht :(
    wäre ja auch zu schön gewesen ;)
    ich kann ja mal versuchen die seite von google übersetzen zu lassen lol
     
  17. ghost-ccc, 28.04.2012 #17
    ghost-ccc

    ghost-ccc Android-Hilfe.de Mitglied

    Beiträge:
    73
    Erhaltene Danke:
    5
    Registriert seit:
    28.03.2012
    Phone:
    HTC Sensation
    hi kennt jemand die warnung im LogCat MediaPlayer info/warning (1, 902)
     

Diese Seite empfehlen