【问题标题】:Gesture detection on FragmentFragment 上的手势检测
【发布时间】:2013-11-16 15:52:39
【问题描述】:

我有一个Activity,其中包含一个Fragment

getFragmentManager().beginTransaction().add(android.R.id.content, fragment1).commit();

我的问题是,我如何检测手势?我尝试了OnTouchListener,也尝试了onInterceptTouchEvent 方法。基本上我想检测滑动。我的SwipeGestureDetector 看起来像这样:

public class SwipeGestureDetector extends SimpleOnGestureListener {

    // ...

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

    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) {
                // right to left swipe

            } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                // left to right swipe

            }
        } catch (Exception e) {
            // nothing
        }
        return false;
    }
}

然后我在我的Activity注册它:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ..

        SwipeGestureDetector swipeDetector = new SwipeGestureDetector();
        final GestureDetector detector = new GestureDetector(this, swipeDetector);
        findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return detector.onTouchEvent(event);
            }
        });
    }

不幸的是,没有检测到滑动手势。我怎样才能做到这一点?请不要建议使用ViewPager,我不能使用它。

【问题讨论】:

  • 这个问题解决了吗?
  • @WonderCsabo 我正在这样使用它......但它不起作用......请看看...... pastebin.com/n9JPGrCn

标签: android android-fragments gesture gesture-recognition


【解决方案1】:

这是我为这个问题所做的解决方法。

我必须在 Activity 中覆盖 dispatchTouchEvent() 方法。当窗口发生触摸事件时调用它。

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

    return handled;
}

【讨论】:

    【解决方案2】:

    WonderCsabo's Answer 并不完全适合我。该代码的问题是,在我的活动中,我有一个视图寻呼机和一个片段,其中有几个可点击的视图。没有使用该代码调用任何单击或滑动处理程序,因此它破坏了我的东西。显然,处理得太频繁了。所以 if (!handled) 阻止了寻呼机和片段接收他们的触摸事件。

    所以我试着去掉 if 语句,现在它似乎工作了。这里是活动课。它有一个视图寻呼机和一个片段

    public class MyActivity extends Activity  {
    
    private SectionsPagerAdapter sectionsPagerAdapter;
    private ViewPager viewPager;
    ArrayList<Class> tabsFragmentClasses = new ArrayList<Class>();
    private GestureDetector gestureDetector;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ride_detail_activity);
    
        viewPager = (ViewPager) findViewById(R.id.pager);
    
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new MyFragment(),"MyFragment")
                    .commit();
        }
    
        gestureDetector = new GestureDetector(this,gestureListener);
    }
    
    GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener(){
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            final int SWIPE_MIN_DISTANCE = 120;
            final int SWIPE_MAX_OFF_PATH = 250;
            final int SWIPE_THRESHOLD_VELOCITY = 200;
            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) {
                    Log.i("Tag", "Right to Left");
                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.i("Tag", "Left to Right");
                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }
    
        @Override
        public boolean onDown(MotionEvent event) {
            return true;
        }
    };
    

    现在,如果我像 Android Detecting Common Gestures Docs 解释那样完成此操作,我将添加此代码。

    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
        gestureDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
    

    问题在于,手势检测器仅适用于没有启用触摸功能的视图(例如我的视图寻呼机和按钮)的情况。改用这段代码

    @Override
    public boolean dispatchTouchEvent(MotionEvent event){
        this.gestureDetector.onTouchEvent(event);
        return super.dispatchTouchEvent(event);
    }
    

    然后发生的情况是片段中的视图和视图寻呼机确实像往常一样获得所有触摸事件,但我也在侦听器中获得手势事件。

    【讨论】:

      【解决方案3】:

      我刚刚重写了GestureListener#onDown() 方法返回true

      【讨论】:

        猜你喜欢
        • 2011-09-23
        • 2016-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多