从通讯录获取联系人头像始终拉伸问题求助(附代码)
解决联系人头像拉伸变形的问题
嘿,我明白你遇到的头像拉伸问题有多闹心——毕竟谁都不想联系人头像看起来歪歪扭扭的😅。咱们来一步步解决这个问题:
问题根源
你现在直接通过contactIm.setImageBitmap(photo)把获取到的Bitmap设置到ImageView中,而ImageView默认会强制将图片拉伸适配自身的宽高尺寸,完全忽略了原图的宽高比例,这就是导致变形的核心原因。
解决方案
这里给你两种实用的解决思路,按需选择:
1. 直接调整ImageView的缩放模式(最简单)
你可以在XML布局文件里给你的contactIm设置合适的scaleType属性,或者在代码里动态设置:
centerCrop:保持图片宽高比,裁剪图片的部分区域来填满ImageView,适合圆形/方形头像,不会变形fitCenter:按比例缩放图片,让图片完整显示在ImageView内,可能会在ImageView边缘留下空白
XML设置示例:
<ImageView android:id="@+id/contactIm" android:layout_width="80dp" android:layout_height="80dp" android:scaleType="centerCrop" />
代码动态设置示例(放在你设置Bitmap之前):
contactIm.setScaleType(ImageView.ScaleType.CENTER_CROP); contactIm.setImageBitmap(photo);
2. 自定义Bitmap尺寸,按比例缩放后再设置
如果需要更精细的控制(比如不想裁剪图片,同时要适配ImageView尺寸),可以写一个工具方法来对Bitmap进行等比例缩放:
private Bitmap scaleBitmapToFitImageView(Bitmap bitmap, ImageView imageView) { int targetWidth = imageView.getWidth(); int targetHeight = imageView.getHeight(); // 如果ImageView还没完成测量,先获取布局参数里的尺寸 if (targetWidth == 0 || targetHeight == 0) { targetWidth = imageView.getLayoutParams().width; targetHeight = imageView.getLayoutParams().height; } float widthRatio = (float) targetWidth / bitmap.getWidth(); float heightRatio = (float) targetHeight / bitmap.getHeight(); // 取较小的比例,保证图片完整显示 float scaleRatio = Math.min(widthRatio, heightRatio); return Bitmap.createScaledBitmap( bitmap, (int) (bitmap.getWidth() * scaleRatio), (int) (bitmap.getHeight() * scaleRatio), true ); }
然后修改你原有代码的else块:
} else { Bitmap scaledBitmap = scaleBitmapToFitImageView(photo, contactIm); contactIm.setImageBitmap(scaledBitmap); // 别忘了回收原图,避免内存泄漏 if (photo != scaledBitmap) { photo.recycle(); } }
额外建议
如果你的头像需要显示为圆形,还可以结合centerCrop和圆形裁剪的Drawable来实现,这样既不会变形,又能得到美观的圆形头像。
内容的提问来源于stack exchange,提问作者Dharmesh Patel
相关产品推荐
相关产品推荐

