假设是肖像模式,我有一个ImageView,其图像的大小可变(但总是方形)。我希望ImageView的宽度始终等于布局的宽度(fill_parent),你可以看到scaleType是“centerCrop”,它将进行缩放。
问题在于,如果我将* layout_height *设置为“fill_parent”,那么,如果centerCrop保留原始宽高比,则高度优先,并且图像在左侧和右侧被裁剪。 (这当然假设屏幕比它宽)。但是,如果我将layout_height设置为“wrap_content”,则不再缩放高度,我最终得到一个裁剪的矩形。这样做是因为它尊重图像的原始高度。
是否有layout_height设置优先于layout_width为“fill_parent”?
<ImageView
android:id="@+id/iv_image"
android:layout_width="fill_parent"
android:layout_height="?"
android:layout_below="@id/header"
android:layout_centerHorizontal="true"
android:contentDescription="@string/cd_image"
android:padding="0dp"
android:scaleType="centerCrop"
android:src="@drawable/blank_album" />
删除android:layout_height属性会导致崩溃: java.lang.RuntimeException:二进制XML文件行#16:您必须提供layout_height属性。
设置android:layout_height =“0dp”会垂直压缩图像。
答案:结合其他用户的回复,我找到了一个适合我的简单解决方案。
首先,图像视图具有此配置(请注意 fitStart ):
<ImageView
android:id="@+id/iv_album"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/header"
android:layout_gravity="top"
android:background="#FF00FF00"
android:contentDescription="@string/app_name"
android:padding="0dp"
android:scaleType="fitStart"
android:src="@drawable/blank_album" />
然后以编程方式对图像高度进行小幅修改以匹配宽度(在Activity.onResume()内)
ImageView iv = (ImageView)findViewById(R.id.iv_album);
boolean bPost = iv.post(
new Runnable()
{
public void run()
{
ImageView iv = (ImageView)findViewById(R.id.iv_album);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)iv.getLayoutParams();
params.width = ASong.this.findViewById(R.id.song_view_layout_top).getWidth();
params.height = params.width;
iv.setLayoutParams(params);
}
});
if (bPost == false)
{
throw new RuntimeException("runnable not posted");
}
答案 0 :(得分:2)
昨天我不得不处理这个问题。这是解决我问题的XML:
<ImageView
android:id="@+id/character"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentBottom="true"
android:background="@android:color/transparent"
android:scaleType="fitCenter"
android:src="@drawable/ma_un1_001" />
请参阅此处的主题:Center drawable and scale height
简而言之:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitCenter"
答案 1 :(得分:2)
或者,您可以通过编程方式执行此操作:
使用LinearLayout
环绕ImageView<LinearLayout
android:id="@+id/container"
android:layout_below="@id/header"
android:layout_centerHorizontal="true"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/iv_image"
android:layout_width="fill_parent"
android:layout_height="?"
android:contentDescription="@string/cd_image"
android:padding="0dp"
android:scaleType="centerCrop"
android:src="@drawable/blank_album" />
</LinearLayout>
然后,在你的onCreate()中插入
findViewById(R.id.container).post(
new Runnable() {
public void run() {
LinearLayout container = (LinearLayout)findViewById(R.id.container);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)container.getLayoutParams();
params.height = params.width;
container.setLayoutParams(params);
}}
);
代码必须是post(),因为主进程不能直接修改布局结构。