Пользовательский вид излишне перерисован - PullRequest
1 голос
/ 03 июля 2011

Я создал пользовательское представление 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 , I не понимаю, почему прокрутка влияет на мой пользовательский вид, это не нужно.

Кто-нибудь может дать подсказку по этому поводу?

Ответы [ 2 ]

1 голос
/ 03 июля 2011

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

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

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

android: layout_marginBottom = "1px "

0 голосов
/ 03 июля 2011

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

...