Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测可单击项目上的投掷手势_Java_Android_Android Layout_Android Resources - Fatal编程技术网

Java 检测可单击项目上的投掷手势

Java 检测可单击项目上的投掷手势,java,android,android-layout,android-resources,Java,Android,Android Layout,Android Resources,想象一个有4个按钮的布局 _______________________________ | | | | A | B | |______________|________________| | | | | C | D | |______________|________________|

想象一个有4个按钮的布局

 _______________________________
|              |                |
|      A       |       B        |
|______________|________________|
|              |                |
|      C       |       D        |
|______________|________________|
我想在整个布局中检测投掷姿势,但当投掷开始时,没有检测到按钮

我正在使用:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gesturedetector= new GestureDetector(this, this);

    findViewById(R.id.touchContainer).setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.e("","TouchEvent");
            return gesturedetector.onTouchEvent(event);
        }
    });
}
当没有可点击的项目,但如果从可点击的项目开始投掷,则失败


我怎样才能解决这个问题?为一个完整的工作答案提供50分悬赏

我实现这一点的一个方法是覆盖以下方法:

public boolean onInterceptTouchEvent(MotionEvent event){
    super.onInterceptTouchEvent(event);
    ...
您可以在布局容器中覆盖此方法(例如,ViewGroup,或您按住按钮的任何对象),并继续从中返回
false
,以便“截获”子
视图
使用的触摸事件(即您的按钮)。在该重写方法中,您可以使用
MotionEvent
s调用手势检测器对象。此方法还可以“查看”以
视图组本身为目标的事件,这意味着——如果我没记错的话——您只需要从该方法中调用您的手势检测器,并且在执行此操作时,手势检测器将“查看”所有事件,无论它们是否通过按钮。因此,如果你从一个按钮开始拖动手指,然后在布局背景上的某个点结束,手势检测器应该可以看到整个滑动。您不需要向手势检测器提供布局自己的
onTouchEvent()
中的事件,因为它已经看到了这些事件

第二种方式:

我只是看了一下我使用这个的项目,意识到我换了一种不同的方式。我实际上做的是设计我所有的孩子
视图
,这样父
活动
(或包含
视图组
)可以在所有这些孩子
视图
中注册相同的手势检测器对象(我的每个特殊
视图
都有一个名为
registerGestureDetector()
)的方法)。然后,在我的孩子
视图
s中被覆盖的“onTouchEvent()”中,我将
运动事件
s传递给已在该
视图
中注册的手势检测器。换句话说,父视图组和所有子视图共享同一个手势检测器


我意识到这听起来可能有点麻烦,而且考虑到可以使用
onInterceptTouchEvent()
来完成这项工作,也没有必要这么做,但我的应用程序处理了一些非常复杂的规则,涉及我的
视图如何响应触摸事件和手势,它允许我应用一些额外的逻辑,这些逻辑是我的应用程序所需要的。然而,我使用的这两种方法在这里实现了相同的基本目标:将针对各种
视图的
运动事件
s引导到同一个手势检测器对象。

将对完整的工作答案给予50分作为奖励
称为“悬赏”,StackExchange站点长期实施的一个概念。请参阅此常见问题部分:lol。只是您肯定需要在这个问题上设置悬赏,并且您可能希望top offer超过50个代表。为什么?我认为答案很可能是一个自定义的滑动检测器,它可以跨多个控件工作……页面上写着“问题2天后是否有资格获得赏金”,所以我会尽快打开赏金并将其分配给答案。当然,如果没有一个简单的答案,我会付更多的钱,其实没有问题,只是有一个想法。。。我不太熟悉Android UI,但在其他平台上,我会在按钮上覆盖一个透明的面板。面板将处理所有事件,其中刷卡将以一种方式处理,点击将转换为按下网格“下方”中的按钮@Addev:您是如何解决问题的?请分享代码。非常感谢您的回答,只是测试一下,但两个答案似乎都有效!=)。如果在父“视图组”上设置为true,则应自动启用此项。但事实并非如此。也许是虫子?文档是含糊不清的,尽管使用了“可能”这样的措辞,并且没有指定当触摸事件同时发生在两个视图上(上下)时会发生什么。我在代码中使用了自定义日历,我想使用fling来滑动日历。但它在onInterceptTouchEvent的CalendarView上不起作用。你能分享你的onInterceptTouchEvent代码吗?@Trevor:有使用第一种方法的示例或教程的链接吗?谢谢