我有一个复杂的xml布局,其中一部分是:
...
<FrameLayout
android:id="@+id/parent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_weight="1" >
<ImageView
android:id="@+id/flexible_imageview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@drawable/gradient"
android:orientation="vertical"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingTop="8dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</FrameLayout>
...
FrameLayout @+id/parent
的高度必须在运行时确定,因为它显示在许多其他视图上方,并且必须在布局中显示。这样,FrameLayout可以完美地填充剩余空间(使用height =&#34; 0dp&#34;以及weight =&#34; 1&#34;属性)。
ImageView @+id/flexible_imageview
从网络接收图像,并始终以正确的宽高比显示。这部分也已经可以了。此视图是最大的,应确定FrameLayout @+id/parent
的大小。
问题在于,在绘制图像时,FrameLayout @+id/parent
的宽度不会被调整为包裹并且应该是ImageView @+id/flexible_imageview
。
感谢任何帮助。
我更新了布局,以澄清一些缺失的部分,并在所有部分后面添加推理。
我想要的是拥有一个未知尺寸的图像(ImageView @+id/flexible_imageview
),在它上面有一个渐变和一些文本在渐变的顶部。我无法将FrameLayout @+id/parent
尺寸设置为wrap_content
,因为此图像后面必须显示更多视图。如果布局中没有足够的空间,则图像(ImageView @+id/flexible_imageview
)将减少,直到它完全适合布局,但它应保持其纵横比,并在其上保持渐变/文本。
@ drawable / gradient只是:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="270"
android:endColor="#aa000000"
android:startColor="#00000000" />
</shape>
我在下面添加了两张图片来展示发生了什么,以及会发生什么:
错误:
正确:
答案 0 :(得分:0)
如果您在布局中更多地了解了您要完成的任务(而不是布局本身,但用户应该在屏幕上看到什么以及布局中的其他元素是什么),那将有所帮助。
具有多个孩子的FrameLayout通常是&#34;代码气味&#34;。通常,FrameLayouts应该只有一个子元素。所以这让我想知道你的设计是否有问题。
- 编辑 -
如果我理解正确,您正在尝试使用framelayout来包装图像的内容,但同时在帧布局之前/之后匹配其他布局视图中剩余的空间。
框架布局的父视图/布局是什么?
我发现这个设计或你的解释存在一些问题:
您将framelayout宽度设置为与父级匹配,但您想要包装图像的内容。
您希望缩小imageView,但不考虑线性布局中的文本视图。您已将它们设置为包装内容。因此,当名气布局很小时,您将看不到所有的文本视图。 (除非你以某种方式调整它们的大小)。
很抱歉,如果这不够有用,但很难理解您要使用此布局完成的工作。一个示例用例将有助于为您提供更好的推荐。
答案 1 :(得分:0)
当尺寸(宽度/高度)为MeasureSpec.EXACTLY
时,adjustViewBounds不会影响它。
在您的情况下,android:width="match_parent"
确保图片视图的大小与父级一样,无论adjustViewBounds如何。
它的工作原理是因为高度为wrap_content
- 在缩放图像以填充宽度时调整高度。
当你覆盖高度以适应屏幕上的所有内容时(这可能不是一个好主意),宽度仍然与父级匹配,并且不会被调整。但是,因为缩放类型为ScaleType.FIT_CENTER
,所以缩放并定位图像,使其整体适合ImageView
的边界(并居中...因此名称)。
如果您打开绘制布局边界的调试选项,或使用hierarchyviewer查看您的应用程序,您将看到图像视图仍然与其父级的宽度匹配。
有几种方法可以做你想做的事。 由于您已经手动计算了高度,因此设置宽度不应该那么难。
Drawable drawable = imageView.getDrawable();
if (drawable != null && drawable.getIntrinsicWidth() > 0 && drawable.getIntrinsicHeight() > 0) {
int height = // however you calculate it
int width = height / (getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth());
}
你可能也会离开
<ImageView
android:id="@+id/flexible_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:minWidth="9999dp" />
即使这样可行,您可能无法再使用权重在水平LinearLayout中使用它(例如,如果您想要布局的横向变体),或许多其他场景。