自定义视图不必要地重绘

时间:2011-07-03 08:28:16

标签: android redraw custom-view

我创建了一个自定义视图 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);

现在从表面看时效果很好,但滚动 contentFrame 时,我的自定义视图的onDraw()方法(在这种情况下为 KTab )会不断调用,我不明白为什么我的自定义视图受到滚动的影响,这是不必要的。

任何人都可以提供这方面的线索吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

  

机器人:layout_marginBottom =&#34; 1px的&#34;

答案 1 :(得分:0)

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