2012-12-18 27 views
5

tôi đặt sự kiện onFling() của Gesture trên ScrollView, nhưng nó không phải đang làm việc trên scrollview,Làm thế nào để thiết lập sự kiện onFling() của cử chỉ trên ScrollView trong 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> 

không ai biết làm thế nào để triển khai sự kiện onFling() trên Scrollview ??

+0

Bạn đang trả về false trong các phương thức ghi đè này, hãy cố gắng trả về đúng sự thật. –

Trả lời

13

Điều này phù hợp với tôi. Hy vọng rằng bạn có thể thêm các thao tác nhấn đúp tại đây.

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

cảm ơn bạn thân, công việc của nó cho scrollview cũng ... – Jayesh

+0

Quan trọng là ghi đè 'dispatchTouchEvent'. Làm việc cho tôi quá! –

+0

Vẫn hoạt động trong năm 2016! –

Các vấn đề liên quan