如何拦截安卓列表视图子级的水平投掷



我想响应垂直滚动列表视图中单个单元格上的水平"投掷"手势。 目前,我已经通过对列表中的每个单元格视图使用手势检测器来实现这一点。

不过,我注意到,与仅仅停留在非滚动线性布局中相比,实际获得水平"投掷"以注册其中一个单元格视图要困难得多。

例如,如果我在单元格内向下点击,然后相当快地"向上和向右"拖动我的手指,这在非滚动情况下被识别为投掷,但在滚动情况下无法识别。

我已经尝试过子类化ListView并覆盖InterceptTouchEvent,然后我似乎无法正确处理它。我希望发生的是,滚动视图忽略最终在子视图上被识别为"跳跃"的手势。 我想根据手势的"角度"来限制这些,即 Y 距离与 X 距离的比率。 如果该比率足够高,则它是"垂直"投掷,ListView 应该处理它。 如果该比率足够低,则它是"水平"抛弃,ListView 应忽略它并允许子视图处理它。

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

试试这个:

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);

相关内容

  • 没有找到相关文章

最新更新