从Assets文件夹重新调整图像以适合屏幕

时间:2015-12-28 22:30:59

标签: java android image

我在资源文件夹中有各种不同大小的图像,并且遵循制作安卓游戏的教程here,并且想知道如何扩展我的图像以适应屏幕尺寸? 我正在使用4个不同的类和主菜单类,我正在尝试加载菜单Image:

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:

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

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:

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));


}

最后,例如,在这个主菜单类中,我想从我的资源文件夹中将菜单图像绘制到屏幕上。但是图像不是正确的屏幕尺寸,我希望能够将其设置为调整后的尺寸,以便我的游戏可以在多个设备上运行。

MainMenuScreen.java(相关部分):

@Override
public void paint(float deltaTime) {
    Graphics g = game.getGraphics();
    g.drawImage(Assets.menu, 0, 0);
}

我应该怎么做呢?我不想在ImageView中设置图像,因为我使用纯粹的java而不是游戏的xml ....至少对于我将使用的背景图像......我应该保留其他资产(像字符一样大小,对吧?

1 个答案:

答案 0 :(得分:0)

获取

def Check(self,fname):
    client = SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.load_system_host_keys()
    client.connect(self.ip,22,self.username,self.password)
    ping_command = 'ping -n -c 5 '+str(self.ip)
    stdin, stdout, stderr = client.exec_command(ping_command)
    for line in stdout.readlines():
        print line
    try:                        
        with open(fname,'ab') as text_file:
            text_file.wirte(stdout)
        text_file.close()        
    except IOError:
        pass        
    client.close()

然后在你的背景上涂抹

Bitmap bitmapBob;
bitmapBob = BitmapFactory.decodeResource(this.getResources(), R.drawable.wall);

如有必要,请使用此功能

    Rect dest = new Rect(0, 0, getWidth(), getHeight());
    // Draw bob as background with dest size
    canvas.drawBitmap(bitmapBob, null, dest, paint);