1

我创建了一个自定义视图com.mydomain.android.KTab,如下图所示,我在顶部有一个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);

现在从表面上看效果很好,但是当我滚动contentFrame时,我的自定义视图(在本例中为KTab )的 onDraw() 方法会不断被调用,我不明白为什么我的自定义视图会受到滚动的影响,它是不必要。

任何人都可以提供线索吗?

4

2 回答 2

1

好的,我已经解决了这个问题。

这是一个非常微妙的问题,当我将 FrameLayout 和我的自定义视图彼此相邻放置时,当我在 FrameLayout 中滚动 ScrollView 时,我的自定义视图将失效(然后调用 onDraw())。我这是因为两个视图彼此相邻并且有 1 个像素重叠,当 ScrollView 滚动然后失效时,我的自定义视图也是如此。

诀窍是确保 FrameLayout 和我的自定义视图之间至少有 1 个像素的间隙,将以下内容添加到 FrameLayout 属性可以挽救我的生命。

android:layout_marginBottom="1px"

于 2011-07-03T16:33:24.917 回答
0

默认情况下,ScrollView 是透明的(isOpaque() return false),放置在滚动视图内的视图可以位于任何位置(因此在屏幕之外),以便它可以显示滚动视图下方的自定义视图......因此 android无法优化在您的自定义视图上调用 draw()。您可以通过继承 ScrollView 并覆盖返回 true 的 isOpaque() 来缓解它(但它可能会产生奇怪的伪影)或(更好)在 framelayout 和 ScrollView 之间放置一些完全不透明的视图。

于 2011-07-03T08:37:26.390 回答