考虑以下布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg1" >
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg2" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<!-- some views here -->
</LinearLayout>
</FrameLayout>
我正在使用bg2
bg1
,而bg2
仍然完全独立,这样我就可以申请一个补间动画的alpha动画,不会影响其他任何内容。
bg1
和bg2
是XML drawable。显然,它们应该按照各自的View尺寸进行缩放。通常就是这种情况,明确指定其尺寸似乎没有多大意义。
不幸的是,在3 / API 11之前的Android版本上,看起来好像bg2
的大小为零。也许两阶段布局测量是错误的(请注意bg2
如何从其父级继承其高度,而父级又需要调整到LinearLayout
的高度并将该信息传播到视图包含bg2
)。或者View可能不会接受其父级的高度(虽然我尝试ImageView
没有改变任何东西)。
您看到的布局实际上用于列表中的项目。
XML drawables是有状态的并且使用渐变。
你能想到一种适用于Android API 8到10的方法吗?
答案 0 :(得分:3)
一些测试(子类化View
,覆盖onMeasure()
和onLayout()
)表明在较旧的Android版本中,FrameLayout
在这方面已被打破。
由于FrameLayout
无法在此方案中向层次结构中传递自己的高度(View
始终会0
同时显示onMeasure()
和onLayout()
)没有明显的方法可以通过子类来解决这个问题。
接下来的问题是,是否有另一种方法来覆盖Android 2.2 aka API 8可以正确处理的两个视图。
唉,有。使用RelativeLayout
可以实现同样的效果,当然,这需要更多的开销,尽管渲染工作的实际增加应该是有限的。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg1" >
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignTop="@+id/item"
android:layout_alignBottom="@+id/item"
android:background="@drawable/bg2" />
<LinearLayout
android:id="@+id/item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>