wie beide OnTouch zu implementieren und auch in einer gleichen Listenansicht onfling?
-
10-10-2019 - |
Frage
ich habe ein Listview und umgesetzt Onclick und auch ist onfling.problem, wenn ich Sie schleudern (Swipe links nach rechts), Onclick-Ereignis von Listview wird auch executed.How bekommen dieses Problem zu lösen? , wie man differenzierbare touch (tap) und schleudern (Swipe) in Listview?
listClickListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,int position, long id) {
//Job of Onclick Listener
}
};
mContactList.setOnItemClickListener(listClickListener);
mContactList.setAdapter(adapter);
// Gesture detection
gestureDetector = new GestureDetector(new MyGestureDetector(prosNos));
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
mContactList.setOnTouchListener(gestureListener);
}
public class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// My fling event
return false;
}
}
P. S. Ist es möglich? die OnClickListener von Listview und das Schreiben der gleichen Logik in jedem onTouchEvent zu kommentieren? aber noch habe ich keinen Zweifel, dass onFling rufen OnTouch. Bin ich richtig?
Lösung
Pseudo code answer to clarify the above comments. How to have the MySimpleGestureListener's onTouch method called.
public class GestureExample extends Activity {
protected MyGestureListener myGestureListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myGestureListener = new MyGestureListener(this);
// or if you have already created a Gesture Detector.
// myGestureListener = new MyGestureListener(this, getExistingGestureDetector());
// Example of setting listener. The onTouchEvent will now be called on your listener
((ListView)findViewById(R.id.ListView)).setOnTouchListener(myGestureListener);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// or implement in activity or component. When your not assigning to a child component.
return myGestureListener.getDetector().onTouchEvent(event);
}
class MyGestureListener extends SimpleOnGestureListener implements OnTouchListener
{
Context context;
GestureDetector gDetector;
public MyGestureListener()
{
super();
}
public MyGestureListener(Context context) {
this(context, null);
}
public MyGestureListener(Context context, GestureDetector gDetector) {
if(gDetector == null)
gDetector = new GestureDetector(context, this);
this.context = context;
this.gDetector = gDetector;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return super.onFling(e1, e2, velocityX, velocityY);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return super.onSingleTapConfirmed(e);
}
public boolean onTouch(View v, MotionEvent event) {
// Within the MyGestureListener class you can now manage the event.getAction() codes.
// Note that we are now calling the gesture Detectors onTouchEvent. And given we've set this class as the GestureDetectors listener
// the onFling, onSingleTap etc methods will be executed.
return gDetector.onTouchEvent(event);
}
public GestureDetector getDetector()
{
return gDetector;
}
}
}
Andere Tipps
Catch the Multi Click Event
I Solve this problem by this way, It is pretty Simple!
Object.setOnTouchListener( new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
// button press
initialX = event.getX();
initialY = event.getY();
break;
case MotionEvent.ACTION_UP:
//button release
float finalX = event.getX();
float finalY = event.getY();
if (initialX > finalX)
{
//Right to Left swipe performed
}
if (initialX < finalX)
{
//Left to Right swipe performed
}
if (initialY < finalY) {
//Log.d( TAG, "Up to Down swipe performed" );
}
if (initialY > finalY) {
//Log.d( TAG, "Down to Up swipe performed" );
}
break;
case MotionEvent.ACTION_CANCEL:
Log.d( TAG, "Action was CANCEL" );
break;
case MotionEvent.ACTION_OUTSIDE:
Log.d( TAG, "Movement occurred outside bounds of current screen element" );
break;
case MotionEvent.ACTION_MOVE:
Toast.makeText(getApplicationContext(), "Action was MOVE",Toast.LENGTH_SHORT ).show();
break;
}
return true;
}
} );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow