誤區:嘗試調用 ImageView.setGravity(Gravity.CENTER) 來居中圖片,但 View.setGravity() 僅影響**容器內子 View 的佈局**,不影響 View 內容(如圖片)的對齊。
在將 ImageView 添加到父容器(如 LinearLayout、FrameLayout)時,設置 LayoutParams.gravity:
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.icon);
// 關鍵:根據父容器類型選擇正確的 LayoutParams
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.gravity = Gravity.CENTER; // 或 Gravity.CENTER_HORIZONTAL / VERTICAL
parentLayout.addView(imageView, params);
| 父容器 | LayoutParams 類 |
|---|---|
| LinearLayout | LinearLayout.LayoutParams |
| RelativeLayout | RelativeLayout.LayoutParams |
| FrameLayout | FrameLayout.LayoutParams |
| ConstraintLayout | ConstraintLayout.LayoutParams |
若需圖片在 ImageView 邊界內居中,使用 setScaleType:
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); // 或 CENTER, FIT_CENTER 等
GridLayout grid = new GridLayout(this);
grid.setColumnCount(3);
grid.setRowCount(3);
for (int i = 0; i < 9; i++) {
ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.icon);
iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
lp.width = 0; lp.height = 0; // 佔比分配
lp.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f);
lp.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f);
lp.setGravity(Gravity.CENTER); // 在網格單元格內居中
grid.addView(iv, lp);
}
setContentView(grid);
區分「View 在容器中的位置」與「內容在 View 內的對齊」,精準控制佈局。