正确缩放或调整图像或精灵的大小,保持其原始宽高比

时间:2013-11-20 14:23:33

标签: java algorithm scale aspect-ratio

我在这个网站上经历了很多答案,但遗憾的是没有解决我要描述的问题。

我在横向模式下设计了一款800x520的应用。所有资产均使用预定义的窗口大小设计。我使用了单位制,但我认为这与此无关。

现在,我有一个85x70大小的精灵/图像。我希望它能够扩展,但无论实际设备的窗口/屏幕尺寸如何,都要保持其原始宽高比。到目前为止,我有以下内容,它保持比例,但没有正确调整大小意味着如果设备屏幕宽度和高度都大于我预定义的窗口大小,它显示精灵仍然很小。如果高度没有变化,但只有宽度或宽度没有变化,只有高度变化,那就没问题了。图像不应在x或y上缩放。但是下面的这个片段不起作用。

float screenW = Screen.SCREEN_WIDTH; // Predefined width 800
float screenH = Screen.SCREEN_HEIGHT; // Predefined height 520

float deviceW = Gdx.graphics.getWidth(); // Actual device width that can vary
float deviceH = Gdx.graphics.getHeight(); // Actual device height that can vary

float changeX = screenW / deviceW; // Also tried deviceW / screenW 
float changeY = screenH / deviceH; // Also tried deviceH / screenH

// I tried applying the changeX and changeY  above
// in sprite's scale.x and scale.y respectively but no luck
// So I tried the below to get the new size of the sprite 
// with and without applying scale above..
// Tried a lot of ways but no luck

float newWidth = (Sprite.WIDTH * changeX);
float newHeight = (Sprite.HEIGHT * changeY);

只要我有正确的算法,我就不需要任何实际的代码,我很感激。

1 个答案:

答案 0 :(得分:2)

changeXchangeY的计算似乎倒退了。例如,如果新设备的宽度为1600,则您希望按比例缩放2.您的changeX将为1/2。

尝试类似:

float changeX = deviceW / screenW;
float changeY = deviceH / screenH;

计算完这些后,您需要按2中的较小者进行缩放以保持纵横比。

float scale = Math.min(changeX, changeY);

然后,您可以通过将原始精灵值乘以scale

来计算新值