Android中ImageView设WRAP_CONTENT仍留大量空白的问题求助
我之前也遇到过一模一样的情况,问题核心在于ImageView没有根据图片的实际尺寸自动调整自身边界,哪怕设置了WRAP_CONTENT也会出现不必要的空白。下面是具体的原因分析和解决方案:
问题根源
当你仅设置layout_height="wrap_content"但未开启adjustViewBounds属性时,ImageView不会根据加载完成的图片宽高比来计算自身的合适高度。再加上Picasso加载前的占位图(48dp的沙漏图标)会让ImageView初始测量高度被固定,加载完真实图片后也没能重新调整到匹配图片的高度,最终就导致图片之间出现大量空白。
解决方案:开启adjustViewBounds
只需要给动态创建的ImageView添加一行代码,开启adjustViewBounds属性,它会让ImageView自动根据图片的固有宽高比调整自身尺寸,完美适配图片大小:
for(picture in reference!!.pictures) { val imageView = ImageView(this) imageView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT) imageView.scaleType = ImageView.ScaleType.FIT_CENTER // 关键:开启自动调整边界 imageView.adjustViewBounds = true Picasso.with(this) .load(picture) .placeholder(R.drawable.ic_hourglass_empty_black_48dp) .into(imageView) pictures.addView(imageView) }
原理说明
adjustViewBounds的作用是让ImageView在测量时严格保持图片的原始宽高比。当你把ImageView的宽度设为MATCH_PARENT(占满父容器宽度),高度设为WRAP_CONTENT时,它会根据图片的实际宽度和宽高比,计算出刚好能完整容纳图片的高度,不会出现多余的空白区域。
如果之后仍有小部分空白,可能是图片本身尺寸过小,FIT_CENTER会让它居中显示,这时候可以根据需求调整scaleType(比如用CENTER_CROP填充整个ImageView,或者FIT_XY拉伸,但会变形),不过你的场景下FIT_CENTER配合adjustViewBounds应该就能解决主要的空白问题了。
内容的提问来源于stack exchange,提问作者Sebastien

