3

我创建了一个自定义视图,您可以在其上用手指绘制路径。它扩展了 View 类。

当我在 ListView 中使用它作为其项目之一时,如果用户触摸自定义视图,则 ListView 会滚动。我怎样才能防止这种情况发生?

我想我需要以某种方式关注我的自定义视图。但我不知道怎么做。

更新:

我找到了可能的解决方案。在我的自定义视图的onTouchEvent(Motion event)方法中,我放置了getParent().requestDisallowInterceptTouchEvent(true);.

如果没有这个,用户触摸自定义视图时的事件队列如下所示:

  1. MotionEvent.ACTION_DOWN
  2. MotionEvent.ACTION_MOVE
  3. MotionEvent.ACTION_MOVE
  4. MotionEvent.ACTION_CANCEL

当我收到MotionEvent代码时MotionEvent.ACTION_CANCELListView开始滚动。

4

2 回答 2

2

requestDisallowInterceptTouchEvent(true)在孩子的方法中设置onTouch(View, MotionEvent)有效:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewGroup item = (ViewGroup) inflater.inflate(R.layout.list_item, null);
        Button button = (Button)item.findViewById(R.id.list_item_btn);
        button.setText("button " + position);

        button.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                listView.requestDisallowInterceptTouchEvent(true);
                return false;
            }

        });

        return item;
    }
于 2014-03-31T11:52:43.833 回答
0

我认为你还应该扩展 ListView 小部件。

正如您所说,当您触摸自定义视图时,列表视图将滚动。
当您触摸自定义视图时,触摸事件将沿视图层次分派,
我认为 listview 可能会吃掉触摸事件。
所以你的 customview 不能接收到触摸事件。
如果您不了解触摸事件的调度。
你可以阅读这个在 ViewGroup 中管理触摸事件

最后。
我建议你扩展 ListView 并覆盖onInterceptTouchEvent()方法。
您可以决定您的 ListView 是否要在onInterceptTouchEvent()中处理触摸事件。
当你判断触摸应该由drawPathView处理时,
你可以让ListView不要拦截它。
所以你的 drawPathView 可以得到 toch 事件。
而且listView也不会滚动

于 2013-10-04T03:44:03.990 回答