0

我想在垂直滚动的 ListView 中响应单个单元格上的水平“投掷”手势。目前,我已经通过对列表中的每个单元格视图使用 GestureDetector 来完成此操作。

不过,我注意到,与仅卡在非滚动线性布局中相比,实际获得水平“弹跳”以向其中一个单元格视图注册要困难得多。

例如,如果我在一个单元格内向下点击,然后很快将手指“向上和向右”拖动,这在非滚动情况下被识别为一扔,但在滚动情况下不被识别。

我已经尝试过对 ListView 进行子类化并覆盖 onInterceptTouchEvent,然后我似乎无法做到正确。我希望发生的是最终将在子视图上被识别为“甩动”的手势被滚动视图忽略。我想根据手势的“角度”来限制这些,即 Y 距离与 X 距离的比率。如果该比率足够高,那么它是一个“垂直”投掷,ListView 应该处理它。如果该比率足够低,那么它就是一个“水平”抛投,ListView 应该忽略它并允许子视图处理它。

谁能提供一些关于如何实现这一点的观点?我假设我将不得不在 ListView 子类的 onInterceptTouchEvent 方法中做一些聪明的事情。

4

1 回答 1

0

try this:

final ListView v = new ListView(this);
ArrayAdapter<String> a = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
a.add("one");
a.add("two");
a.add("three");
a.add("four");
v.setAdapter(a);

OnGestureListener ogl = new SimpleOnGestureListener() {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (Math.abs(velocityX) > Math.abs(velocityY)) {
            Log.d(TAG, "onFling " + v.pointToPosition((int) e1.getX(), (int) e1.getY()));
            return true;
        }
        return false;
    }
};
final GestureDetector detector = new GestureDetector(ogl);
OnTouchListener otl = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return detector.onTouchEvent(event);
    }
};
v.setOnTouchListener(otl);
OnItemClickListener oicl = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.d(TAG, "onItemClick " + position);
    }
};
v.setOnItemClickListener(oicl);
setContentView(v);
于 2013-11-07T20:06:41.603 回答