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
相关产品推荐
相关产品推荐

