如何在屏幕的某些部分禁用调度触摸事件

时间:2012-10-11 06:57:01

标签: android android-mapview dispatchevent

我想禁用某些区域的调度触摸,以便您理解这是我的屏幕。

enter image description here

你可以在图像中看到页眉,页脚和Mapview,但是当我点击位置按钮(标题的右侧)时,我的地图也会收到通知(就像它被触摸一样),这是我不想要的。我希望只有按钮的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 个答案:

答案 0 :(得分:7)

您可以覆盖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);
}

答案 1 :(得分:2)

MapView收到dispatchTouchEvent()事件的原因是Android开始为最后添加的视图分配事件,如果没有在那里处理,那么它将被分派到最后添加的视图之前,等等...

在xml布局中,首先添加Header,然后添加MapView和最后一个Footer。因此,在您的情况下,首先将事件分派给Footer,然后分配给MapView,最后分配给Header。

您必须选择解决此问题:

  • 最简单的方法是重新排列布局中的项目,从mapview开始,然后添加所有其他项目。您可能需要使用相对布局才能正确定位它们。使用此MapView将不会看到按钮处理的事件。
  • 保持布局并让MapView接收事件。 MapView将需要测试事件是由他处理还是被忽略。为此,您可以使用@Nunu提取的代码,这应该可以使用。也许您需要添加按钮Y坐标按钮高度。
祝你好运。

答案 2 :(得分:0)

使用相对布局,底部是Map View,按钮点击顶部..并为按钮添加click事件

答案 3 :(得分:0)

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