Как отключить отправку сенсорного события в какой-то части экрана

Я хочу, чтобы отключить сенсорный дисплей для некоторых областей для вашего понимания здесь мой экран.

Вы можете видеть верхний, нижний и нижний колонтитулы на изображении, но когда я нажимал на кнопку местоположения (справа в заголовке), моя карта также получала уведомления (как будто ее коснулись), чего я не хочу. Я хочу, чтобы только событие 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 ответа

Решение

Вы можете переопределить 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);
}

Причина, по которой MapView получает dispatchTouchEvent() events - это то, что Android начинает обрабатывать события для последнего добавленного представления, и если он там не обрабатывается, то он отправляется последнему, добавленному до этого представления, и так далее...

В макете XML вы сначала добавляете заголовок, затем MapView и последний нижний колонтитул. Таким образом, в вашем случае события сначала отправляются в нижний колонтитул, затем в MapView и, наконец, в верхний колонтитул.

Вы должны решить эту проблему:

  • Самый простой способ - изменить порядок элементов в макете, начиная с просмотра карты, а затем добавляя все остальные. Возможно, вам придется использовать относительное расположение, чтобы иметь возможность правильно их расположить. При этом MapView не увидит события, которые обрабатываются кнопкой.
  • Сохраните свой макет и позвольте MapView получать события. MapView должен будет проверить, должно ли событие обрабатываться им или игнорироваться. Для этого вы можете использовать код, предложенный @Nunu, который должен работать. Возможно, вам нужно добавить к кнопке Y координаты высоты кнопки.

удачи.

Используйте относительное расположение с представлением карты внизу и кнопкой, чтобы щелкнуть вверху.. и добавить событие нажатия для кнопки

Используйте view.bringToFront() для получения мест просмотра над другими видами.

Другие вопросы по тегам