Java [Android] Listener, welches beim Loslassen ein Ereignis auslöst, gesucht

T

Tersus

Gast
[Android] Listener, welcher beim Loslassen ein Ereignis auslöst, gesucht.

Guten Abend,

ich würde meine Views, welche ich in einer (Eco)Gallery verwalte, gerne mit einem Listener versehen, welcher genau dann ein Ereignis auslöst, wenn ich den Finger vom Bildschirm nehme.

Bestensfalls soll mir in dem Listener die Information, was in der Zeit des Finger-auf-die-View-Haltens passiert, ebenfalls übergeben werden. Ich will wissen, ob ich in der Zeit des Finger-auf-die-View-Haltens den Finger möglichst still gehalten habe, oder ob ich gewischt habe.

Kennt sich da einer aus? Vielen Dank!

Grüße
 
Zuletzt bearbeitet von einem Moderator:
Laut Doku View.OnTouchListener und dann das MotionEvent auswerten?
ACTION_UP soll wohl auch enthalten was zwischenzeitig passiert ist, ansonsten ACTION_MOVE ebenfalls auswerten.
 
Du suchst den onTouchListener.
http://developer.android.com/reference/android/view/View.OnTouchListener.html

onTouch sagt Dir bei diesem
- welche View geklickt wurde
- welches MotionEvent passiert ist

z.B MotionEvent "ACTION_UP" ist der Zeitpunkt wenn ein Click ausgeführt wurde und der Finger wieder abgehoben wurde.
Es kommen also praktisch dauerhaft onTouch Events mit dem eweiligen MotionEvent, sodass du entsprechend reagieren kannst
 
Ja, den OnTouchListener habe ich schon versucht, funktioniert aber nicht so, wie ich das gerne hätte.

Um herauszufinden, ob eine Bewegung während des Gedrückthaltens stattfand (event.getAction() == MotionEvent.ACTION_MOVE) muss man den OnTouchListener mindestens ein mal true zurückgeben lassen. Und wenn nicht schon beim ersten Berühren meiner View der OnTouchListener false zurückgibt, dann kann ich die EcoGallery nicht mehr scrollen ... . :(
 
Tersus schrieb:
Um herauszufinden, ob eine Bewegung während des Gedrückthaltens stattfand (event.getAction() == MotionEvent.ACTION_MOVE) muss man den OnTouchListener mindestens ein mal true zurückgeben lassen. Und wenn nicht schon beim ersten Berühren meiner View der OnTouchListener false zurückgibt, dann kann ich die EcoGallery nicht mehr scrollen ... .

Wie meinst du das?

Habs mal mit einer minimalistischen App probiert (bestehend aus lediglich einer Activity mit einer ImageView, welche den ganzen Bildschirm ausfüllt).

Code:
@Override
protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ImageView g = (ImageView) findViewById(R.id.imageView1);
		g.setOnTouchListener(new OnTouchListener() {
			float maxDistance = 0f;
			float startX, startY;

			@Override
			public boolean onTouch(View v, MotionEvent event) {
                                if (event.getAction() == MotionEvent.ACTION_DOWN) {
	 				startX = event.getX();
					startY = event.getY();
					maxDistance = 0f;
				}
				if (event.getAction() == MotionEvent.ACTION_MOVE) {
					float distance = distance(startX, startY, event.getX(),
							event.getY());
					if (distance > maxDistance) {
						maxDistance = distance;
						System.out.println("New maxDistance: " + maxDistance);
					}
				}				
				if (event.getAction() == MotionEvent.ACTION_UP) {
					System.out.println("maxDistance: "+maxDistance);
					if(maxDistance > 50f) {
						System.out.println("nervous?");
					}
				}
				return true;
			}
		});
}

private float distance(float startX, float startY, float endX, float endY) {
		return (float) Math.sqrt((startX - endX) * (startX - endX)
				+ (startY - endY) * (startY - endY));
}

Du könntest z.B. auch jeden Punkt beim Bewegen abspeichern und so die gesamte Bewegung auswerten.
In diesem Beispiel wird z.B. gleich das ganze Event gespeichert.. je nachdem, was du eben vor hast.

PS: Der Code dient natürlich nur der Veranschaulichung.
Ich weiß nicht, ob solche Berechnungen lieber Device/Auflösungsabhängig gemacht werden sollten, aber grundsätzlich sollte dir das eine Vorstellung geben.
(System.out (statt Log) und andere Dinge sollte man in einem richtigen Projekt natürlich auch anders lösen...).



mfg
 
Nein, so schnell ist mein Problem nicht gelöst! Es ist deutlich komplexer.

Ich möchte meine (Eco)Gallery wie eine ListView nutzen! In einer ListView kann man auch mehrere Buttons reinpacken und diese nach belieben klicken.

Bei der (Eco)Gallery ist das etwas problematisch! Die (Eco)Gallery verliert ihre Scrollfähigkeit, wenn ein Button oder auch eine View clickable ist. Also muss man statt eines OnClickListeners einen OnTouchListener verwenden.

Die OnTouchGeste beeinflusst die Scrollbarkeit der (Eco)Gallery nicht.

Hier ein Codebeispiel:

MainActivity
Code:
import android.os.Bundle;
import android.app.Activity;
import android.widget.Gallery;

public class MainActivity extends Activity{

	private Gallery _gallery = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		_gallery = new Gallery(this);
		_gallery.setAdapter(new SimplerAdapter(this));
		_gallery.setSpacing(0);
		
		setContentView(_gallery);
						
	}

}

SimplerAdapter (Es wurde hier der Einfachheit halber die veraltete Gallery verwendet!)
Code:
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.TextView;

public class SimplerAdapter extends BaseAdapter implements OnTouchListener{

	private final Context _Context;
	
	public SimplerAdapter(Context _context) {

		this._Context = _context;		
		
	}
	
	@Override
	public int getCount() {
		return 50;
	}

	@Override
	public Object getItem(int position) {
		return position;
	}

	@Override
	public long getItemId(int position) {
		return 0;
	}
	
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		
		View _View = convertView;

		if (_View == null) {
			
			Gallery.LayoutParams eglp = new Gallery.LayoutParams
				(Gallery.LayoutParams.MATCH_PARENT, Gallery.LayoutParams.MATCH_PARENT);
			
			_View = new TextView(_Context);
			((TextView)_View).setTextSize(20 * _Context.getResources().getDisplayMetrics().density);
			_View.setLayoutParams(eglp);
			_View.setOnTouchListener(this);
			
		}
		
		((TextView )_View).setText("" + position);
				
		return _View;
		
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		
		if(v instanceof TextView){
			
			((TextView) v).setText("wurde berührt");
			
		}
		
		return false;
		
	}
	
}

Das Problem liegt nun bei der onTouch(...) - Methode. Gibt diese true zurück, ist die Gallery wieder nicht scrollbar.
Aber wenn wir false zurückgeben, wird für jede View sofort das Event ausgelöst.

Was ich will ist, dass der Listener der jeweiligen View, welche sich in der Gallery befindet, nur ausgelöst wird, wenn ich nicht durch die Gallery scrolle.
 
Zurück
Oben