简体   繁体   English

重新缩放图像以适合素材资源文件夹中的屏幕

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM