2012-12-18 11 views
5

ho impostato la manifestazione onFling() del Gesto sul ScrollView, ma non sta lavorando su ScrollView,Come impostare l'evento OnFling() di Gesture su ScrollView in Android?

package com.doubletap; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.GestureDetector.OnDoubleTapListener; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.MotionEvent; 
import android.widget.TextView; 

public class DoubleTapActivity extends Activity implements OnGestureListener 
{ 
private GestureDetector gd; 

private TextView tvTap; 

String TAG = getClass().getSimpleName(); 

private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    tvTap = (TextView)findViewById(R.id.tvTap); 

    gd = new GestureDetector(this); 

    gd.setOnDoubleTapListener(new OnDoubleTapListener() 
    { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) 
     { 
      return false; 
     } 

     @Override 
     public boolean onDoubleTapEvent(MotionEvent e) 
     { 
      return false; 
     } 

     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) 
     { 
      return false; 
     } 
    }); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    return gd.onTouchEvent(event);//return the double tap events 
} 

@Override 
public boolean onDown(MotionEvent e) 
{ 
    return false; 
} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
{ 

    try { 
     if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
     { 
      return false; 
     } 

     if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      tvTap.setText("Flip Right to Left"); 
      Log.v(TAG, "Right to Left"); 
     } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      tvTap.setText("Flip Left to Right"); 
      Log.v(TAG, "Left to Right"); 
     } 
    } catch (Exception e) 
    { 

    } 
    return false; 
} 

@Override 
public void onLongPress(MotionEvent e) 
{ 
} 

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
{ 
    return false; 
} 

@Override 
public void onShowPress(MotionEvent e) 
{ 
} 

@Override 
public boolean onSingleTapUp(MotionEvent e) 
{ 
    return false; 
} 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:text="@string/hello" 
    android:textStyle="bold" /> 
<TextView 
    android:id="@+id/tvTap" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dip" > 
</TextView> 
<TextView 
    android:id="@+id/tvTapEvent" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dip" > 
</TextView> 
<ScrollView 
    android:id="@+id/scroll" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button1" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button2" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button3" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button4" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button5" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button6" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button7" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button8" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button9" /> 
     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Button10" /> 
    </LinearLayout> 
</ScrollView> 

qualcuno sa come implementare l'evento onFling() su Scrollview ??

+0

Si sta restituendo false in questi metodi sovrascritti, provare a restituire true aswell. –

risposta

13

Questo funziona per me. Spero che tu possa aggiungere le tue azioni di doppio tocco qui.

public class ScrollViewFling extends Activity 
{ 
    private GestureDetector mGesture; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.scrollviewfling); 
     mGesture = new GestureDetector(this, mOnGesture); 

    } 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     boolean handled = super.dispatchTouchEvent(ev); 
     handled = mGesture.onTouchEvent(ev);  
     return handled; 
    } 

    private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() { 

     @Override 
     public boolean onDown(MotionEvent e) { 
      return false; 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      Log.v("fling", "Flinged."); 
      return true; 
     } 

     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
      return false; 
     } 
    }; 
}; 
+0

grazie amico, funziona anche per scrollview ... – Jayesh

+0

Importante è l'override di 'dispatchTouchEvent'. Funziona anche per me! –

+0

funziona ancora nel 2016! –