Android中ImageView设置ClipDrawable后无法显示问题求助
触发ClipDrawable不显示的常见原因
level设置时机早于Drawable绑定到ImageView,此时Drawable未获取到合法的绘制边界,裁剪逻辑失效- ImageView的缩放类型与ClipDrawable的裁剪逻辑冲突,修改了Drawable的绘制区域
- 未主动给ClipDrawable设置绘制边界,默认边界为0导致内容不可见
修复步骤
第一步:调整代码执行顺序
修改代码逻辑,先将ClipDrawable绑定到ImageView再设置level,修改后的代码如下:
private fun updateFirstImage(imageUri: String){ Glide.with(requireContext()).asDrawable().load(imageUri).into(object: CustomTarget<Drawable>(){ override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) { val clipDrawable = ClipDrawable(resource, Gravity.START, ClipDrawable.HORIZONTAL) // 先绑定Drawable到ImageView binding.editorFirstImage.setImageDrawable(clipDrawable) // 再设置level,设置level会自动触发重绘,无需手动调用invalidateSelf clipDrawable.level = 10000 } override fun onLoadCleared(placeholder: Drawable?) {} }) }
第二步:异常场景排查
如果调整后仍无法显示,逐一验证以下配置:
- 先直接将Glide返回的
resource设置到ImageView,排除图片加载失败的问题 - 检查ImageView的
scaleType属性,临时设置为center或者fitStart测试,避免centerCrop、fitXY等类型覆盖裁剪逻辑 - 主动给ClipDrawable设置绘制边界,在设置level前添加如下代码:
clipDrawable.setBounds(0, 0, binding.editorFirstImage.measuredWidth, binding.editorFirstImage.measuredHeight) - 如果需要保留原ImageView的缩放类型,将ClipDrawable包裹进
LayerDrawable后再设置到ImageView,避免裁剪逻辑被缩放逻辑覆盖
内容的提问来源于stack exchange,提问作者Serhii Bilotserkovets
相关产品推荐
相关产品推荐

