gpt4 book ai didi

android - 缩放固定的 SurfaceView 以垂直填充并保持纵横比

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:33:36 28 4
gpt4 key购买 nike

我一直在努力寻找答案,但似乎找不到答案(这是一种相当非常规的 Android 游戏编程方法,所以这是意料之中的,至少我认为是这样)。

我正在尝试在 Android 中创建一个 GBA 风格的 RPG 游戏(出于怀旧之情)。 OpenGL 对我来说不够好,因为它在游戏循环中的可定制性不够(我只想在需要绘制某些东西时调用 draw,因为我希望这款游戏在使用方式上非常高效电池,这意味着让它更像是一个投票应用程序而不是游戏)。我创建了一个自定义表面 View ,它有自己的线程,只要需要完成绘图就会被调用(我在 SDK 中的示例 LunarLander android 游戏之后对其进行了建模)。

问题是,我希望游戏本身具有固定大小 (208x160),然后放大到屏幕大小。我遇到的问题是,在 XML 中的扩展 SurfaceView 的正常参数中,似乎无论如何都无法这样做。当前状态下的游戏如下图所示。我试图让它拉伸(stretch)到屏幕的高度并保持宽度的比例,同时也不增加可观看的游戏(保持它固定,无论屏幕尺寸如何)。

/image/EWIdE.png (我打算在线发布实际图像。防止垃圾邮件会咬我>.<)

目前,我正在获取 SurfaceView 的 Canvas 并直接在其上绘图,并将我的尺寸作为硬编码像素尺寸(208 像素、160 像素)提供。

这是线程当前在获取 Canvas 并绘制到 Canvas 时的样子。在不改变我希望游戏虚拟占用的大小的情况下,有什么更好的方法可以绘制到 Canvas 上?

@Override
public void run()
{
Canvas c = null;
try
{
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder)
{
draw(c);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (c != null)
surfaceHolder.unlockCanvasAndPost(c);
}
}

绘制方法是这样的(StringBuilder是我自己在引擎中编码的Object):

public void draw(Canvas canvas)
{
canvas.drawColor(Color.GRAY);
StringBuilder stringBuilder = new StringBuilder(canvas, Color.BLACK, letters);
stringBuilder.drawString("Oh, hello there!");
stringBuilder.setLocation(10, 20);
stringBuilder.drawString("Why am I so small?");
}

有什么想法吗?

最佳答案

假设您的 draw 函数被重命名为 drawBase。以下是您的操作方法:

public void draw(Canvas canvas)
{
final float scaleFactor = Math.min( getWidth() / 208.f, getHeight() / 160.f );
final float finalWidth = 208.f * scaleFactor;
final float finalHeight = 160.f * scaleFactor;
final float leftPadding = ( getWidth() - finalWidth ) / 2;
final float topPadding = ( getHeight() - finalHeight ) / 2;

final int savedState = canvas.save();
try {
canvas.clipRect(leftPadding, topPadding, leftPadding + finalWidth, topPadding + finalHeight);

canvas.translate(leftPadding, topPadding);
canvas.scale(scaleFactor, scaleFactor);

drawBase(canvas);
} finally {
canvas.restoreToCount(savedState);
}
}

关于android - 缩放固定的 SurfaceView 以垂直填充并保持纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10707519/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com