在Android Studio/JavaScript中如何将Canvas填充色背景替换为图片背景
Canvas 背景色替换为图片填充方案
操作步骤
- 提前在
draw()方法外部初始化适配尺寸的背景位图,避免重复加载导致性能损耗,可在onSurfaceCreated等Surface初始化完成的回调中执行初始化逻辑:
// 类内声明背景位图全局变量 private Bitmap bgBitmap; @Override public void surfaceCreated(SurfaceHolder holder) { // 获取Surface实际宽高 int canvasWidth = getWidth(); int canvasHeight = getHeight(); // 解码drawable资源中的背景图,将R.drawable.bg_canvas替换为你的背景图资源名 Bitmap originBg = BitmapFactory.decodeResource(getResources(), R.drawable.bg_canvas); // 缩放为与Canvas尺寸匹配的位图 bgBitmap = Bitmap.createScaledBitmap(originBg, canvasWidth, canvasHeight, true); // 回收原始位图释放内存 originBg.recycle(); }
- 替换原有背景色绘制逻辑,将你标注的
canvas.drawColor(Color.argb(255, 26, 128, 182));行替换为背景位图绘制代码,修改后的draw()方法示例:
private void draw(){ if (ourHolder.getSurface().isValid()) { canvas= ourHolder.lockCanvas(); // 替换原纯色背景绘制,绘制背景图,0,0为左上角起始坐标 canvas.drawBitmap(bgBitmap, 0, 0, paint); paint.setColor(Color.argb(255, 231, 172, 104)); canvas.drawBitmap(playerShip.getBitmap(), playerShip.getX(), ScreenY - playerShip.getHeight(), paint); for(int i = 0; i < numInvaders; i++) { if (invaders[i].getVisibility()) { if (uhOroh) { canvas.drawBitmap(invaders[i].getBitmap(), invaders[i].getX(), invaders[i].getY(), paint); } else { canvas.drawBitmap(invaders[i].getBitmap2(), invaders[i].getX(), invaders[i].getY(), paint); } } } // 请确保原有代码存在画布提交逻辑,如遗漏请补充 ourHolder.unlockCanvasAndPost(canvas); } }
注意事项
- 需确保背景位图缩放尺寸和Canvas实际宽高一致,避免出现拉伸、留白、显示不全问题
- 禁止在
draw()方法中执行位图解码操作,draw()方法调用频率极高,重复解码会导致帧率大幅下降、内存抖动 - 若背景图存在透明通道,可保留原
drawColor行先清空画布,再绘制背景图,避免上一帧画面残留
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

