Android:如何通过Canvas缩放Bitmap适配不同分辨率屏幕消除黑边?
解决Android游戏背景图适配长屏设备的问题
问题原因
你当前直接按原图尺寸绘制背景,没有根据设备屏幕的实际尺寸做适配,导致像三星A34这类长屏设备(1080×2340)的屏幕高度超出背景图的1920px,底部出现黑条。
解决方案
要实现背景图铺满无黑条且保持比例不变,按以下步骤修改代码:
1. 提前加载并缓存背景图
避免每次绘制时重复解码资源造成性能浪费,在初始化阶段(比如onCreate或SurfaceHolder.Callback的surfaceCreated方法)加载背景图:
private Bitmap originalBg; private Bitmap scaledBg; private int drawX, drawY; @Override public void surfaceCreated(SurfaceHolder holder) { // 加载原始背景图 originalBg = BitmapFactory.decodeResource(getResources(), R.drawable.backgame); // 获取屏幕实际可用尺寸 DisplayMetrics metrics = getResources().getDisplayMetrics(); int screenWidth = metrics.widthPixels; int screenHeight = metrics.heightPixels; // 计算等比例缩放系数(优先铺满屏幕,避免黑条) float scaleX = (float) screenWidth / originalBg.getWidth(); float scaleY = (float) screenHeight / originalBg.getHeight(); float scale = Math.max(scaleX, scaleY); // 取较大的缩放值,保证铺满屏幕 // 生成缩放后的背景图 scaledBg = Bitmap.createScaledBitmap(originalBg, (int) (originalBg.getWidth() * scale), (int) (originalBg.getHeight() * scale), true); // 计算居中绘制的坐标 drawX = (screenWidth - scaledBg.getWidth()) / 2; drawY = (screenHeight - scaledBg.getHeight()) / 2; }
2. 绘制缩放后的背景图
在onDraw方法中使用缩放后的Bitmap绘制:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setFilterBitmap(true); paint.setDither(true); // 绘制适配后的背景 canvas.drawBitmap(scaledBg, drawX, drawY, paint); }
3. 其他图形元素的适配建议
- 不要用固定像素值设置元素位置,改用屏幕尺寸的百分比计算,比如按钮位置设为
screenWidth * 0.2、screenHeight * 0.8,适配不同屏幕比例 - 如果游戏是全屏模式,记得隐藏状态栏和导航栏,确保获取的屏幕尺寸是完整的可用区域
- 若背景图有可拉伸的区域,可改用NinePatch格式图片,缩放更高效且不会变形
内容的提问来源于stack exchange,提问作者Glezy Production
相关产品推荐
相关产品推荐

