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

Android资源Drawable转Bitmap用于BitmapShader遇问题求解决方案

解决Android Drawable转Bitmap用于BitmapShader的问题

你的核心问题是R.drawable.grid_background并非BitmapDrawable(而是XML定义的GradientDrawable或其他矢量/形状Drawable),所以强转类型会报错,且BitmapFactory.decodeResource无法直接解码这类非Bitmap资源。

通用解决方案是将任意Drawable绘制到空白Bitmap上,生成可用于BitmapShader的Bitmap,具体代码如下:

// 获取目标Drawable
Drawable drawable = ContextCompat.getDrawable(FullscreenActivity.wkContextRef.get(), R.drawable.grid_background);
if (drawable == null) {
    // 处理Drawable为空的情况,比如用默认图或直接返回
    return;
}

// 创建与Drawable尺寸匹配的Bitmap
Bitmap bitmap = Bitmap.createBitmap(
        drawable.getIntrinsicWidth(),
        drawable.getIntrinsicHeight(),
        Bitmap.Config.ARGB_8888 // 根据需求选择合适的配置
);

// 创建Canvas并让Drawable绘制到Bitmap上
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);

// 现在可以用这个bitmap创建BitmapShader了
Paint pintura = new Paint();
pintura.setStyle(Paint.Style.FILL_AND_STROKE);
pintura.setPathEffect(new ComposePathEffect(
        new CornerPathEffect(100f), new DiscretePathEffect(15f, 55f)
));
pintura.setShader(new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));

关键说明:

  • getIntrinsicWidth()/getIntrinsicHeight()获取Drawable的固有尺寸,如果是XML定义的形状Drawable,需确保它有明确的尺寸(比如在XML中设置width/height,或者通过setBounds手动指定)
  • 如果Drawable没有固有尺寸(比如自适应的形状),可以手动指定Bitmap的宽高(比如传入对应View的尺寸)
  • 务必做空判断,避免Context或Drawable为空导致的空指针异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:59:59