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
相关产品推荐
相关产品推荐

