Пользовательский вид излишне перерисован

1

Я создал пользовательский вид com.mydomain.android.KTab, как XML, показанный ниже, у меня есть FrameLayout сверху и мое собственное представление внизу.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/radialback">

<FrameLayout
    android:id="@+id/contentFrame" 
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:layout_gravity="top"
    android:background="#ffcccccc"/>

<view
    class="com.mydomain.android.KTab"
    android:id="@+id/kTab"
    android:layout_width = "fill_parent"
    android:layout_height = "80dip"/>


</LinearLayout>

Я программно добавляю ScrollView в FrameLayout, как в следующем коде:

TextView tv = new TextView(this);
tv.setText("a long long string...");
ScrollView sv = new ScrollView(this);
sv.addView(tv);
FrameLayout fl = (FrameLayout)findViewById(R.id.contentFrame);
fl.addView(sv);

Теперь он работает хорошо, когда видится с поверхности, но метод onDraw() моего пользовательского представления (KTab в этом случае) постоянно вызывается, когда я прокручиваю contentFrame, я не понимаю, почему на мое пользовательское представление влияет прокрутка, это ненужным.

Кто-нибудь может дать понять это?

Теги:
custom-view
redraw

2 ответа

1
Лучший ответ

Хорошо, я решил эту проблему.

Это довольно тонкая проблема, когда я помещаю FrameLayout и мой пользовательский вид в соседние друг с другом, мое пользовательское представление будет признано недействительным (а затем вызывается onDraw()) при прокрутке ScrollView в FrameLayout. Я думаю, это потому, что два представления находятся рядом друг с другом, и 1 пиксель перекрывается, когда ScrollView прокручивается, а затем аннулируется, так что это будет мое пользовательское представление.

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

андроид: layout_marginBottom = "1px"

0

ScrollView прозрачен по умолчанию (isOpaque() возвращает false), и представление, помещенное внутри прокрутки, может находиться в любой позиции (таким образом, вне экрана), чтобы он мог показать ваше пользовательское представление, которое находится под видом прокрутки... Поэтому android не может оптимизировать вызов call draw() на вашем пользовательском представлении. Вы можете смягчить его путем подклассификации ScrollView и переопределения isOpaque(), возвращающего true (но тогда это может привести к появлению странных артефактов), или (лучше) поместить некоторое непрозрачное представление между framelayout и ScrollView.

  • 1
    Ярек, ты потрясающий! Я добавляю пустой TextView между ScrollView и моим настраиваемым представлением, теперь мое настраиваемое представление не будет перерисовываться при прокрутке contentFrame. Но я все еще не понимаю, почему прозрачность / непрозрачность имеют значение здесь.
  • 0
    Пожалуйста :. Поскольку вы новичок на сайте -> на этом сайте есть два способа выразить свою благодарность ... Подтвердите ответ и отметьте его как принятый;)
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню