如何在屏幕的某个区域禁用分发触摸事件

3

我希望禁用某些区域的触摸分发,为了让您更好地理解,这是我的屏幕截图。

enter image description here

您可以在图像中看到标题、页脚和地图视图,但当我点击位置按钮(标题右侧)时,我的地图也会收到通知(就像它被触摸了),这不是我想要的。我只想要按钮的onClick事件被点击,而不是分发事件。

这是我的XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<!-- include title bar for all screen -->

<include
    android:id="@+id/include1"
    layout="@layout/titlebar_layout"
    android:layout_gravity="top" />



<FrameLayout
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.88" 
    >

    <com.google.android.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.63"
        android:apiKey="0VkXbAOFvAq7b6uaGHSmnS2a2VosPxoS6ceHY_g"
        android:clickable="true" >
    </com.google.android.maps.MapView>


</FrameLayout>

<include
    android:id="@+id/include2"
    android:layout_gravity="bottom"
    android:layout_marginBottom="38dp"
    layout="@layout/bottom_layout" />

</LinearLayout>

任何帮助都将不胜感激。
4个回答

8
你可以重写 dispatchTouchEvent 方法,检查用户触摸的屏幕位置。
  @Override
public boolean dispatchTouchEvent(MotionEvent ev) {     
    //first check if the location button should handle the touch event
    if(locBtn != null) {
        int[] pos = new int[2];
        locBtn.getLocationOnScreen(pos);
        if(ev.getY() <= (pos[1] + locBtn.getHeight()) && ev.getX() > pos[0]) //location button event
            return locBtn.onTouchEvent(ev);
    }
        return super.dispatchTouchEvent(ev);
}

嘿,谢谢你的回答。如果这个方法有效,我很快就会回来接受你的答案。 - Kalpesh Lakhani
嘿nunu,你的答案对我非常有帮助,但我仍然无法获得按钮位置,pos[1]是什么?如果我在那里做pos[0],即使我触摸其他地方,我也会不断地得到按钮事件..请帮帮我。 - Kalpesh Lakhani
1
http://developer.android.com/reference/android/view/View.html#getLocationOnScreen(int[]),pos [0] 包含视图的 x,pos [1] 包含 y。试试看 if(ev.getY() <= (pos[1] + locBtn.getHeight()) && ev.getX() > pos[0]) - Nermeen
哇,它终于能用了!SOflow,请允许我给这个答案点赞10次。对我来说真的很有价值,非常感谢@Nunu。 - Kalpesh Lakhani
佩服如此出色的态度。 - Kalpesh Lakhani

2
MapView接收dispatchTouchEvent()事件的原因是Android会将事件分发给最后添加的视图,如果在那里没有处理,那么就会分发到前一个添加的视图,以此类推...
在您的xml布局中,您首先添加Header,然后是MapView,最后是Footer。因此,在您的情况下,事件首先被分派到Footer,然后是MapView,最后是Header。
您有两种解决方法:
- 最简单的方法是重新排列布局中的项目,从MapView开始,然后添加所有其他项目。您可能需要使用相对布局来正确定位它们。这样,MapView将不会看到由按钮处理的事件。 - 保留您的布局并让MapView接收事件。MapView需要测试是否应该处理事件或忽略它。为此,您可以使用@Nunu建议的代码,这应该有效。也许您需要将按钮的Y坐标加上按钮高度。
祝你好运。

+1 没有人能阻止我为这么好的解释点赞..非常感谢 - Kalpesh Lakhani
我很快就会回来欣赏你的答案..:):) - Kalpesh Lakhani
@Luis..谢谢你啊,我按照你和@Nunu提供的第二个选项尝试了一下,但是没成功..:( 你说的把y坐标加到按钮高度上是什么意思啊?先谢过了。 - Kalpesh Lakhani
当您调用getLocationOnScreen()函数时,您将获得按钮顶部的Y坐标。当单击按钮时,用户会单击按钮顶部和按钮之间的区域。您可以通过添加按钮高度来找到按钮的底部y坐标。 - Luis

0
使用view.bringToFront()将视图置于其他视图之上。

0
使用相对布局,将地图视图放在底部,按钮放在顶部,并为按钮添加点击事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接