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

Android中ImageView设置ClipDrawable后无法显示问题求助

触发ClipDrawable不显示的常见原因

  1. level设置时机早于Drawable绑定到ImageView,此时Drawable未获取到合法的绘制边界,裁剪逻辑失效
  2. ImageView的缩放类型与ClipDrawable的裁剪逻辑冲突,修改了Drawable的绘制区域
  3. 未主动给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:18:04