2

考虑以下布局:

<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 可绘制对象。显然,它们应该被缩放到各自视图的尺寸。这通常是这种情况,明确指定它们的尺寸似乎没有多大意义。

不幸的是,在 3/API 11 之前的 Android 版本上,看起来好像大小bg2为零。也许两阶段布局测量是错误的(注意bg2应该如何从其父级继承其高度,而后者又需要调整到LinearLayout高度并将该信息传播到包含的视图bg2)。或者视图可能不会接受其父级的高度(尽管我尝试ImageView了它没有改变)。

您看到的布局实际上用于列表中的项目。

XML 可绘制对象是有状态的并使用渐变。

你能想出一种同样适用于 Android API 8 到 10 的方法吗?

4

1 回答 1

3

一些测试(子类化View、覆盖onMeasure()onLayout())表明FrameLayout在旧的 Android 版本中这方面存在缺陷。

由于FrameLayout在这种情况下无法将自己的高度向下传递到层次结构中(View总是会0同时看到onMeasure()onLayout()),因此没有明显的方法可以通过子类化来解决这个问题。

那么问题是,是否有另一种方法可以覆盖 Android 2.2 aka API 8 可以正确处理的两个视图。

唉,有。使用 a 也可以实现同样的效果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>
于 2013-04-03T17:11:34.650 回答