在 XML 中定義 ImageView 時設置 wrap_content,並通過 setImageBitmap() 設置圖片。但當父佈局空間變小時,ImageView 會跟著縮小,導致圖片被壓縮或重新分配大小,這不是預期行為。
嘗試使用 setScaleType() 來解決,但發現無法阻止 ImageView 本身隨父佈局縮放。
layout_width/height="wrap_content" 意味著 View 的大小由其內容(即圖片)決定,但同時也受父佈局剩餘空間限制。當父佈局空間不足時,ImageView 會被壓縮,導致圖片隨之縮放。
最直接有效的方法是給 ImageView 設置**固定寬高**(dp 或 px),而非 wrap_content:
<ImageView
android:id="@+id/background"
android:layout_width="100dp"
android:layout_height="100dp" />
這樣 ImageView 就會保持 100x100dp 的固定尺寸,不再受父佈局壓縮影響。圖片在該固定區域內的顯示方式(如居中、填充、裁剪)則由 scaleType 控制。
android:scaleType="centerInside" 或 "fitCenter",圖片會在固定框內完整顯示且不變形。"centerCrop" 可填滿區域並保持比例(可能裁剪邊緣)。adjustViewBounds="true" 可讓 View 自適應圖片比例(但需謹慎使用,可能又引入尺寸變化)。<ImageView
android:id="@+id/background"
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="centerInside"
android:src="@drawable/your_image" />
或在 Java/Kotlin 中動態設置:
ImageView imageView = findViewById(R.id.background);
imageView.setImageBitmap(bitmap);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
// 如需固定尺寸,也可在代碼中設置 LayoutParams
ViewGroup.LayoutParams params = imageView.getLayoutParams();
params.width = 300; // 像素
params.height = 300;
imageView.setLayoutParams(params);
若不希望圖片隨父佈局縮放,**請給 ImageView 設置固定寬高**。這是最簡單、最可靠的方案。scaleType 僅控制圖片在 View 邊界內的繪製方式,無法改變 View 自身的佈局行為。