将触摸事件委托给另一个视图

Posted

技术标签:

【中文标题】将触摸事件委托给另一个视图【英文标题】:Delegate touch event to another view 【发布时间】:2015-01-30 10:19:46 【问题描述】:

我有列表视图。用户可以在覆盖此列表视图的全屏Window.FEATURE_NO_TITLE) 上打开对话框。当用户触摸此对话框的背景时,它会关闭。

我需要将此触摸事件委托给列表视图。我的意思是,在 bg 上的 MotionEvent.ACTION_DOWN 之后,我需要关闭对话框(它工作正常),然后在列表视图上启动 MotionEvent.ACTION_DOWN

我尝试过这样的事情:

((LinearLayout) findViewById(R.id.dialog_bg)).setOnTouchListener(new    View.OnTouchListener() 

            @Override
            public boolean onTouch(View v, MotionEvent event) 
                switch (event.getAction()) 
                    case MotionEvent.ACTION_DOWN:
                        MotionEvent motionEvent = MotionEvent.obtain(event);                          
                        activity.findViewById(R.id.fr_projects_list).dispatchTouchEvent(motionEvent);
                        close();

                        break;

                    default:
                        break;
                

                return false;
            
        );

它在列表视图中以 ACTION_DOWN 开头。但仅此而已。 ACTION_MOVE 和其他不起作用 =/

【问题讨论】:

【参考方案1】:

您只发送 ACTION_DOWN 这就是为什么您没有收到任何其他操作。 尝试调度所有操作。

((LinearLayout) findViewById(R.id.dialog_bg)).setOnTouchListener(new    View.OnTouchListener() 

        @Override
        public boolean onTouch(View v, MotionEvent event) 
                    MotionEvent motionEvent = MotionEvent.obtain(event);                          
                    activity.findViewById(R.id.fr_projects_list).dispatchTouchEvent(motionEvent);
                    if(event.getAtction==MotinEvent.ACTION_UP) close();
                    return false;
        
    );

【讨论】:

在我进行触摸事件后,我关闭对话框。所以在那之后对话上不会有其他事件。我应该处理列表视图的事件。 @Suvtruf 我更新了我的答案。试一试.. 仅当操作为 ACTION_UP 时才调用 Close 客户希望在 ACTION_DOWN 时关闭对话框,而不是 ACTION_UP。这不是我的选择)= 好吧.. 我猜如果你在 ACTION_DOWN 上关闭对话,那么默认情况下应该在 ListView 上调用另一个事件。尝试将 touchlistner 设置为您的列表视图。我不是 100% 确定,但你可以试试。 这很有帮助,但如果目标视图有边距,它不能 100% 工作,那么克隆的触摸会有点错位。对这个问题有帮助吗?

以上是关于将触摸事件委托给另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

Android:将手势事件传递给另一个视图

仅将触摸事件转发到被触摸的视图

如何将触摸事件从一个视图传递到另一个视图

安卓权威编程指南-笔记 (第29章定制视图与触摸事件)

将触摸事件传递给父视图

将触摸事件传递给多个选项之一