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

如何在Jetpack Glance Widget中实现图片圆角?cornerRadius仅支持S+版本

在Jetpack Glance Widget中实现兼容低版本的图片圆角效果

当然有办法实现跨版本的图片圆角效果,以下是几种可靠的兼容方案:

方案1:用ShapeDrawable封装图片

通过ShapeDrawable创建带圆角的容器,将图片作为填充内容,这种方式不受系统版本限制:

// 工具函数:生成带圆角的ShapeDrawable
fun createRoundedImageDrawable(context: Context, bitmap: Bitmap, radiusDp: Int): Drawable {
    val radiusPx = radiusDp.dp.toPx(context).toFloat()
    val roundRectShape = RoundRectShape(
        floatArrayOf(radiusPx, radiusPx, radiusPx, radiusPx, radiusPx, radiusPx, radiusPx, radiusPx),
        null,
        null
    )
    val shapeDrawable = ShapeDrawable(roundRectShape)
    shapeDrawable.paint.shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
    return shapeDrawable
}

// 在Glance Widget布局中使用
Image(
    provider = ImageProvider(createRoundedImageDrawable(context, yourBitmap, 16)),
    contentDescription = "带圆角的图片",
    modifier = GlanceModifier.size(100.dp)
)

原理:利用BitmapShader将图片作为ShapeDrawable的填充,通过RoundRectShape定义圆角弧度,所有Android版本均可生效。

方案2:直接裁剪Bitmap生成圆角图片

对原始Bitmap进行裁剪处理,生成自带圆角的Bitmap后再加载:

// 工具函数:裁剪Bitmap为圆角
fun getRoundedCornerBitmap(bitmap: Bitmap, radiusPx: Float): Bitmap {
    val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(output)
    val paint = Paint().apply {
        isAntiAlias = true
    }
    val rect = Rect(0, 0, bitmap.width, bitmap.height)
    val rectF = RectF(rect)

    // 绘制圆角矩形遮罩
    canvas.drawRoundRect(rectF, radiusPx, radiusPx, paint)
    // 设置混合模式只保留图片与遮罩重叠部分
    paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
    canvas.drawBitmap(bitmap, rect, rect, paint)

    bitmap.recycle() // 回收原Bitmap避免内存泄漏
    return output
}

// 在Glance Widget中使用
val roundedBitmap = getRoundedCornerBitmap(originalBitmap, 16.dp.toPx(context))
Image(
    provider = ImageProvider(roundedBitmap),
    contentDescription = "带圆角的图片",
    modifier = GlanceModifier.size(100.dp)
)

注意:这种方式适合静态图片,处理后记得回收原Bitmap,避免Widget内存占用过高。

方案3:背景+裁剪组合(适用于纯色背景场景)

如果图片需要放在纯色背景上,可以通过带圆角的背景配合裁剪实现:

Box(
    modifier = GlanceModifier
        .size(100.dp)
        .cornerRadius(16.dp)
        .background(Color.White) // 纯色背景
) {
    Image(
        provider = ImageProvider(yourImage),
        contentDescription = "带圆角的图片",
        modifier = GlanceModifier
            .fillMaxSize()
            .clip(RoundedCornerShape(16.dp))
    )
}

原理:通过clip修饰符将图片裁剪为圆角,与背景的圆角对齐,实现视觉上的圆角效果。

内容的提问来源于stack exchange,提问作者RitchyCZE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:35:17