избыточные вызовы onDraw () в FrameLayout - PullRequest
1 голос
/ 01 июня 2011

У меня есть следующая структура макета в моем XML:

<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/mainlayout"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">

    <MyEntireView
            android:id="@+id/map"
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent">
    </MyEntireView>

    <FrameLayout
            android:id="@+id/focusedlayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom">

           <MyDetailedView
              android:id="@+id/focus"
              android:layout_width="fill_parent" 
              android:layout_height="fill_parent">
           </MyDetailedView>
    </FrameLayout>
</FrameLayout>

MyEntireView является картой (Drawable), и MyDetailedView всплывает поверх нее после onTouch() и содержит только определенный фрагмент всей карты (также Drawable), который более детально отображает область, которую пользователь коснулся всей карты в MyEntireView.

Когда отображается MyDetailedView - то есть его setVisibility(View.VISIBLE) - в верхней части появляются прозрачные фигуры (также некоторые растровые изображения), которые регулярно перерисовываются (например, с интервалом в 1 секунду). Фигуры добавляются динамически как дочерние элементы @+id/focusedlayout, поскольку их всегда различное количество, и их положение соответствует подробному изображению карты.

И проблема в том, что каждое обновление обрабатывается несколько раз. Каждый раз, когда форма обновляется, вызывается onDraw() MyEntireView, вызывается onDraw() MyDetailedView, а затем эти два вызываются снова. И только после этого сама форма становится недействительной.

В результате, это поведение заставляет форму мерцать, так как MyDetailedView перерисовывает и скрывает форму на 10 мс или около того.

Вероятно, я упускаю из виду некоторую простую логику, но я действительно не могу понять, если есть способ заставить только один вид ViewGroup invalidate ().

Или, может быть, есть альтернативная структура / макет, который я мог бы использовать для своих целей?

Большое спасибо!

P.S. Весь код достаточно большой, чтобы разместить здесь, но я готов вставить любые фрагменты по запросу

...