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

AndroidAuto App中MediaItem圆形图标实现方案咨询

实现带圆形图标的MediaItem列表

方案1:预转换Bitmap为圆形后传入MediaItem.Builder

提前将原始图标Bitmap处理成圆形,再通过setIconBitmap()方法传入MediaItem构建器:

// 工具函数:将Bitmap转换为圆形
fun convertToCircularBitmap(bitmap: Bitmap): Bitmap {
    val outputBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(outputBitmap)
    val paint = Paint().apply {
        isAntiAlias = true
    }
    val rect = Rect(0, 0, bitmap.width, bitmap.height)
    val rectF = RectF(rect)

    // 绘制圆形底色
    canvas.drawOval(rectF, paint)
    // 设置混合模式,只保留圆形区域内的图标内容
    paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
    canvas.drawBitmap(bitmap, rect, rect, paint)

    return outputBitmap
}

// 构建带圆形图标的MediaItem
val originalIcon = BitmapFactory.decodeResource(resources, R.drawable.your_icon)
val circularIcon = convertToCircularBitmap(originalIcon)
val mediaItem = MediaItem.Builder()
    .setIconBitmap(circularIcon)
    .setTitle("媒体标题")
    .setSubtitle("媒体副标题")
    .build()

方案2:优化Glide异步加载逻辑

之前Glide效果不佳大概率是加载时机或转换逻辑没处理到位,试试结合Glide的circleCrop()转换,在异步回调中构建MediaItem:

// 异步加载圆形图标并构建MediaItem
Glide.with(context)
    .asBitmap()
    .load("https://your-icon-url.com/icon.png") // 本地资源或网络URL都可
    .circleCrop()
    .addListener(object : RequestListener<Bitmap> {
        override fun onLoadFailed(
            e: GlideException?,
            model: Any?,
            target: Target<Bitmap>?,
            isFirstResource: Boolean
        ): Boolean {
            // 加载失败时使用默认方形图标兜底
            val defaultItem = MediaItem.Builder()
                .setIconResource(R.drawable.default_icon)
                .setTitle("媒体标题")
                .build()
            // 将defaultItem添加到列表
            return false
        }

        override fun onResourceReady(
            resource: Bitmap?,
            model: Any?,
            target: Target<Bitmap>?,
            dataSource: DataSource?,
            isFirstResource: Boolean
        ): Boolean {
            resource?.let { circularBitmap ->
                val mediaItem = MediaItem.Builder()
                    .setIconBitmap(circularBitmap)
                    .setTitle("媒体标题")
                    .build()
                // 将mediaItem添加到列表并刷新视图
            }
            return false
        }
    })
    .submit()

如果是在列表控件(如RecyclerView)中使用,建议在onBindViewHolder中执行上述逻辑,避免阻塞主线程,同时做好图标复用。

额外提示

  • 确保圆形图标尺寸符合系统规范(推荐48x48dp),避免拉伸变形
  • 处理Bitmap后及时回收不再使用的原始Bitmap,防止内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:50:43