You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何让图片完美适配GridView并实现方形居中裁剪

方案1:通过布局约束强制ImageView为正方形(推荐)

修改grid_item.xml布局,使用ConstraintLayout给ImageView设置1:1的宽高比,确保它始终是正方形:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/gridImage"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="3dp"
        android:scaleType="centerCrop"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

这里将ImageView的layout_height设为0dp,通过layout_constraintDimensionRatio="1:1"强制宽高相等,配合centerCrop就能实现方形居中裁剪的效果。

方案2:在Adapter中动态设置Item宽高

如果不想修改布局,可以在Adapter的getView方法里,根据屏幕宽度和列数计算Item宽度,再设置高度与宽度相等:

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    if(inflater==null)
        inflater = (LayoutInflater) cx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if(view == null)
        view = inflater.inflate(R.layout.grid_item, null);

    // 计算Item宽度:屏幕宽度减去水平间距总和,除以列数
    DisplayMetrics metrics = cx.getResources().getDisplayMetrics();
    int screenWidth = metrics.widthPixels;
    int horizontalSpacing = 5; // 和GridView的android:horizontalSpacing值一致
    int columnCount = 3; // 和GridView的android:numColumns值一致
    int itemWidth = (screenWidth - (columnCount - 1) * horizontalSpacing) / columnCount;

    // 给ImageView设置正方形尺寸
    ImageView imageView = view.findViewById(R.id.gridImage);
    ViewGroup.LayoutParams params = imageView.getLayoutParams();
    params.width = itemWidth;
    params.height = itemWidth;
    imageView.setLayoutParams(params);

    Pictures p = pictures.get(i);
    Glide.with(cx).load(p.getImageID()).centerCrop().placeholder(R.drawable.avatar).into(imageView);
    return view;
}

同时记得把GridView的layout_width改为match_parent,确保它占满屏幕宽度:

<GridView
    android:id="@+id/grid"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:numColumns="3"
    android:scrollbars="vertical"
    android:horizontalSpacing="5dp"
    android:verticalSpacing="3dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/line" />

额外提示

  • 两种方案二选一即可,无需重复使用。
  • Glide的centerCrop()和ImageView的scaleType="centerCrop"保留一个就行,推荐保留Glide的设置,图片加载阶段裁剪更高效。

内容的提问来源于stack exchange,提问作者Newbie_programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:23:26