[英]Rescaling Image to Fit Screen from Assets Folder
I have a variety of Images in the assets folder that are different sizes and am following the tutorial for making android games here and was wondering how I can scale my images to fit the screen size? 我在Assets文件夹中有各种大小不一的图像,并且正在按照此处制作Android游戏的教程进行操作,并且想知道如何缩放图像以适合屏幕尺寸? I am using 4 different classes and a main menu class where I am trying to load a menu Image: 我正在使用4个不同的类和一个主菜单类,试图在其中加载菜单图像:
Graphics.java: Graphics.java:
package com.ashmore.framework;
import android.graphics.Paint;
public interface Graphics {
public static enum ImageFormat {
ARGB8888, ARGB4444, RGB565
}
public Image newImage(String fileName, ImageFormat format);
public void clearScreen(int color);
public void drawLine(int x, int y, int x2, int y2, int color);
public void drawRect(int x, int y, int width, int height, int color);
public void drawImage(Image image, int x, int y, int srcX, int srcY,
int srcWidth, int srcHeight);
public void drawImage(Image Image, int x, int y);
void drawString(String text, int x, int y, Paint paint);
public int getWidth();
public int getHeight();
public void drawARGB(int i, int j, int k, int l);
}
AndroidGraphics.java: AndroidGraphics.java:
package com.ashmore.framework.Implementation;
import java.io.IOException;
import java.io.InputStream;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import com.ashmore.framework.Graphics;
import com.ashmore.framework.Image;
public class AndroidGraphics implements Graphics {
AssetManager assets;
Bitmap frameBuffer;
Canvas canvas;
Paint paint;
Rect srcRect = new Rect();
Rect dstRect = new Rect();
public AndroidGraphics(AssetManager assets, Bitmap frameBuffer) {
this.assets = assets;
this.frameBuffer = frameBuffer;
this.canvas = new Canvas(frameBuffer);
this.paint = new Paint();
}
@Override
public Image newImage(String fileName, ImageFormat format) {
Config config = null;
if (format == ImageFormat.RGB565)
config = Config.RGB_565;
else if (format == ImageFormat.ARGB4444)
config = Config.ARGB_4444;
else
config = Config.ARGB_8888;
Options options = new Options();
options.inPreferredConfig = config;
InputStream in = null;
Bitmap bitmap = null;
try {
in = assets.open(fileName);
bitmap = BitmapFactory.decodeStream(in, null, options);
if (bitmap == null)
throw new RuntimeException("Couldn't load bitmap from asset '"
+ fileName + "'");
} catch (IOException e) {
throw new RuntimeException("Couldn't load bitmap from asset '"
+ fileName + "'");
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
if (bitmap.getConfig() == Config.RGB_565)
format = ImageFormat.RGB565;
else if (bitmap.getConfig() == Config.ARGB_4444)
format = ImageFormat.ARGB4444;
else
format = ImageFormat.ARGB8888;
return new AndroidImage(bitmap, format);
}
@Override
public void clearScreen(int color) {
canvas.drawRGB((color & 0xff0000) >> 16, (color & 0xff00) >> 8,
(color & 0xff));
}
@Override
public void drawLine(int x, int y, int x2, int y2, int color) {
paint.setColor(color);
canvas.drawLine(x, y, x2, y2, paint);
}
@Override
public void drawRect(int x, int y, int width, int height, int color) {
paint.setColor(color);
paint.setStyle(Style.FILL);
canvas.drawRect(x, y, x + width - 1, y + height - 1, paint);
}
@Override
public void drawARGB(int a, int r, int g, int b) {
paint.setStyle(Style.FILL);
canvas.drawARGB(a, r, g, b);
}
@Override
public void drawString(String text, int x, int y, Paint paint){
canvas.drawText(text, x, y, paint);
}
public void drawImage(Image Image, int x, int y, int srcX, int srcY,
int srcWidth, int srcHeight) {
srcRect.left = srcX;
srcRect.top = srcY;
srcRect.right = srcX + srcWidth;
srcRect.bottom = srcY + srcHeight;
dstRect.left = x;
dstRect.top = y;
dstRect.right = x + srcWidth;
dstRect.bottom = y + srcHeight;
canvas.drawBitmap(((AndroidImage) Image).bitmap, srcRect, dstRect,
null);
}
@Override
public void drawImage(Image Image, int x, int y) {
canvas.drawBitmap(((AndroidImage)Image).bitmap, x, y, null);
}
public void drawScaledImage(Image Image, int x, int y, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight){
srcRect.left = srcX;
srcRect.top = srcY;
srcRect.right = srcX + srcWidth;
srcRect.bottom = srcY + srcHeight;
dstRect.left = x;
dstRect.top = y;
dstRect.right = x + width;
dstRect.bottom = y + height;
canvas.drawBitmap(((AndroidImage) Image).bitmap, srcRect, dstRect, null);
}
@Override
public int getWidth() {
return frameBuffer.getWidth();
}
@Override
public int getHeight() {
return frameBuffer.getHeight();
}
}
Assets.java Assets.java
package com.ashmore.ballescape;
import com.ashmore.framework.Image;
import com.ashmore.framework.Music;
import com.ashmore.framework.Sound;
public class Assets {
public static Image background;
public static Image menu;
public static Image loading;
public static Sound click;
public static Music theme;
public static void load (SampleGame sampleGame) {
theme = sampleGame.getAudio().createMusic("menutheme.mp3");
theme.setLooping(true);
theme.setVolume(0.85f);
theme.play();
}
}
LoadingScreen.java: LoadingScreen.java:
public class LoadingScreen extends Screen {
public LoadingScreen(Game game) {
super(game);
}
@Override
public void update(float deltaTime) {
Graphics g = game.getGraphics();
Assets.menu = g.newImage("menu.jpg", ImageFormat.RGB565);
// Assets.background = g.newImage("background.jpg", ImageFormat.RGB565);
Assets.loading = g.newImage("loading.png", ImageFormat.RGB565);
//Assets.click = game.getAudio().createSound("explode.ogg");
game.setScreen(new MainMenuScreen(game));
}
And finally, for example, in this main menu class, I want to draw the menu image to the screen from my assets folder. 最后,例如,在这个主菜单类中,我想从资产文件夹中将菜单图像绘制到屏幕上。 But the image isn't the correct screen size and I want to be able to have it account for an adjusted size so my game works on multiple devices. 但是图像的屏幕尺寸不正确,我希望能够将其调整为合适的尺寸,以便我的游戏可以在多种设备上运行。
MainMenuScreen.java (relevant section): MainMenuScreen.java(相关部分):
@Override
public void paint(float deltaTime) {
Graphics g = game.getGraphics();
g.drawImage(Assets.menu, 0, 0);
}
How should I go about doing this? 我应该怎么做呢? I don't want to set the image in an ImageView as I am using purely java and no xml for the game....at least for the background images I will use...I should probably keep the other assets (like characters) a certain size, right? 我不想在ImageView中设置图像,因为我使用的是纯Java而不是用于游戏的xml。...至少对于要使用的背景图像...我应该保留其他资产(例如字符) )一定大小吧?
Get It 得到它
Bitmap bitmapBob;
bitmapBob = BitmapFactory.decodeResource(this.getResources(), R.drawable.wall);
Then Apply on your backGround 然后涂在你的背上
Rect dest = new Rect(0, 0, getWidth(), getHeight());
// Draw bob as background with dest size
canvas.drawBitmap(bitmapBob, null, dest, paint);
if necessary use this function 如有必要,请使用此功能
// Resize Bitmap function to Handle all the Images from resources the right size
public Bitmap getResizedBitmap(Bitmap bm, float newWidth, int newHeight) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = newWidth / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(
bm, 0, 0, width, height, matrix, false);
bm.recycle();
return resizedBitmap;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.