Button gedrückt halten -> Werte ändern sich

Arno

Arno

Neues Mitglied
0
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.
 
Arno schrieb:
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.

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
 
  • Danke
Reaktionen: Arno
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:
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! :(
 
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:
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:
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.
 
  • Danke
Reaktionen: ghost-ccc
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:
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?)
 
  • Danke
Reaktionen: ghost-ccc
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]
 
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;
 
  • Danke
Reaktionen: ghost-ccc
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
 
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 ;-)
 
  • Danke
Reaktionen: ghost-ccc
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:
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
 
hi kennt jemand die warnung im LogCat MediaPlayer info/warning (1, 902)
 

Ähnliche Themen

5
Antworten
22
Aufrufe
1.410
590239
5
R
  • RalfKahl
Antworten
10
Aufrufe
278
RalfKahl
R
A
  • AnimaAngelo85
Antworten
1
Aufrufe
326
swa00
swa00
Zurück
Oben Unten