我创建了一个自定义视图 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 )会不断调用,我不明白为什么我的自定义视图受到滚动的影响,这是不必要的。
任何人都可以提供这方面的线索吗?
答案 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之间放置一些完全不透明的视图。