OnTouchListener Event Problem

  • Antworten:3
Tobias M.
  • Forum-Beiträge: 9

24.05.2010, 16:03:43 via Website

Hallo zusammen,

ich habe mir vor ein paar Tagen das HTC Desire zugelegt und wollte nun eine kleine App schreiben. Mit Java bin ich sehr wohl vertraut und die Android spezifischen Sachen gehen dank guter Doku auch recht schnell von der Hand. Allerdings hab ich jetzt ein Problem für welches ich online keine Lösung gefunden habe und vielleicht kann mir hier jemand helfen. Zumindest bin ich hier in den letzten Tagen öfter fündig geworden :-) Ich hoffe Ihr könnt noch einen weiteren Entwickler in Eurer Community gebrauchen.

Nun aber zu meinem Problem. Ich wollte den OnTouchListener benutzen um bestimme Aktionen bei MotionEvent.ACTION_DOWN und MotionEvent.ACTION_UP auszulösen. Dabei ist mir aufgefallen das MotionEvent.ACTION_UP häufiger kommt als ich es angenommen hatte.
Hier etwas code um zu zeigen was ich meine:

1button.setOnTouchListener(new View.OnTouchListener() {
2
3 public boolean onTouch(View arg0, MotionEvent arg1) {
4
5 // Get the action that was done on this touch event
6 switch (arg1.getAction()) {
7
8case MotionEvent.ACTION_DOWN: {
9// Button pressedButton = (Button) arg0;
10 Log.d(TAG, "ACTION_DOWN");
11// AsyncTask execute = new DoOnMotionDownTask().execute(pressedButton);
12 }
13
14 case MotionEvent.ACTION_UP: {
15 Log.d(TAG, "ACTION_UP");
16// AsyncTask execute = new DoOnMotionUpTask().execute();
17 }
18
19 case MotionEvent.ACTION_OUTSIDE: {
20 Log.d(TAG, "ACTION_OUTSIDE");
21// AsyncTask execute = new DoOnMotionUpTask().execute();
22 }
23
24 case MotionEvent.ACTION_CANCEL: {
25 Log.d(TAG, "ACTION_CANCEL");
26// AsyncTask execute = new DoOnMotionUpTask().execute();
27 }
28
29 case MotionEvent.ACTION_MOVE: {
30 Log.d(TAG, "ACTION_MOVE");
31// AsyncTask execute = new DoOnMotionUpTask().execute();
32 }
33 }
34
35 // if you return false, these actions will not be recorded
36 return false;
37 }
38
39 });

Wie ihr seht habe ich die Aktionen mal auskommentiert und statt dessen ein paar Log-Meldungen ausgegeben. Außerdem hab ich noch weiter MotionEvents gefangen um das Verhalten zu untersuchen.

Klicke ich jetzt einmal auf diesen Button und halte die Taste gedrückt so kommen folgende Log-Meldungen:
05-24 13:56:15.833: DEBUG/BoardScreen(3805): ACTION_DOWN
05-24 13:56:15.833: DEBUG/BoardScreen(3805): ACTION_UP
05-24 13:56:15.833: DEBUG/BoardScreen(3805): ACTION_OUTSIDE
05-24 13:56:15.833: DEBUG/BoardScreen(3805): ACTION_CANCEL
05-24 13:56:15.833: DEBUG/BoardScreen(3805): ACTION_MOVE

Sobald ich die Maustaste (oder Finger auf dem HTC Desire) wieder los lasse kommt folgendes:
05-24 13:56:19.833: DEBUG/BoardScreen(3805): ACTION_UP
05-24 13:56:19.833: DEBUG/BoardScreen(3805): ACTION_OUTSIDE
05-24 13:56:19.833: DEBUG/BoardScreen(3805): ACTION_CANCEL
05-24 13:56:19.833: DEBUG/BoardScreen(3805): ACTION_MOVE

Ich hatte also die Maus/Finger für 4 Sekunden auf dem Bildschirm. Aber warum bekomme ich beim einfachen Anklicken (inklusive gedrückt halten) folgende Events? ACTION_UP, ACTION_OUTSIDE, ACTION_CANCEL, ACTION_MOVE?
Es trifft doch nichts davon zu..

Ich hoffe sehr das mir jemand helfen kann und bedanke mich jetzt schon mal für jede Beteiligung.

Gruß,
Tobias

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

24.05.2010, 16:19:00 via Website

Hallo,

mein "first guess" wäre mal ... in den einzelnen Event switches ein "return true;" zu setzen .....

und am ende ein return super.onTouch(arg1);

lg Voss

Antworten
Tobias M.
  • Forum-Beiträge: 9

24.05.2010, 16:31:11 via Website

Danke für Deine Antwort..

Mit "return true" für alles events hatte ich es auch schon probiert. Leider das selbe Ergebnis. "super.onTouch(arg1)" kann ich nicht aufrufen. Die methode ist in der super Klasse (View.OnTouchListener) abstract.

Antworten
Tobias M.
  • Forum-Beiträge: 9

24.05.2010, 16:46:51 via Website

Gibt es doch gar nicht.. So klappt es:

1MyListener myListener = new MyListener(applicationContext);
2button.setOnTouchListener(myListener);

1public class MyListener extends View implements View.OnTouchListener{
2
3 public MyListener(Context context, AttributeSet attrs) {
4 super(context, attrs);
5 // TODO Auto-generated constructor stub
6 }
7
8 public MyListener(Context context, AttributeSet attrs, int defStyle) {
9 super(context, attrs, defStyle);
10 // TODO Auto-generated constructor stub
11 }
12
13 public MyListener(Context context) {
14 super(context);
15 // TODO Auto-generated constructor stub
16 }
17
18 public static String TAG = "MyListener";
19
20 @Override
21 public boolean onTouch(View arg0, MotionEvent arg1) {
22
23 // Get the action that was done on this touch event
24 switch (arg1.getAction()) {
25 case MotionEvent.ACTION_DOWN: {
26// Button pressedButton = (Button) arg0;
27 Log.d(TAG, "ACTION_DOWN");
28// AsyncTask execute = new DoOnMotionDownTask().execute(pressedButton);
29 return true;
30 }
31
32 case MotionEvent.ACTION_UP: {
33 Log.d(TAG, "ACTION_UP");
34// AsyncTask execute = new DoOnMotionUpTask().execute();
35 return true;
36 }
37
38 case MotionEvent.ACTION_OUTSIDE: {
39 Log.d(TAG, "ACTION_OUTSIDE");
40// AsyncTask execute = new DoOnMotionUpTask().execute();
41 return true;
42 }
43
44 case MotionEvent.ACTION_CANCEL: {
45 Log.d(TAG, "ACTION_CANCEL");
46// AsyncTask execute = new DoOnMotionUpTask().execute();
47 return true;
48 }
49
50 case MotionEvent.ACTION_MOVE: {
51 Log.d(TAG, "ACTION_MOVE");
52// AsyncTask execute = new DoOnMotionUpTask().execute();
53 return true;
54 }
55 }
56
57 // if you return false, these actions will not be recorded
58 return super.onTouchEvent(arg1);
59 }
60}

Ich weiß nicht woran es liegt, aber mit dem eigenen Listener (extends View) und dem "return super.onTouchEvent(arg1);" geht es irgendwie. Jetzt kommen nur noch die events die auch erwartet hatte.

Dankeschön :-)

Antworten