3

我正在学习如何制作动态壁纸,但我有一个进退两难的问题,我敢肯定所有刚开始的人都会遇到。

有这么多分辨率的屏幕尺寸,我怎样才能让一组艺术品在所有版本的代码中重新缩放?我知道它已经完成了,因为我看到了很多 apk 中的图像并且它们被重新缩放。

如果它只是一张不需要任何定位的图像,那会很容易,但我的问题是我必须重新调整背景图像以适合所有设备,我还有适合该背景上某个 x 和 y 位置的动画图像适合到位,因此看起来整个背景都在动画,但只有部分是动画(我远离 300 帧逐帧动态壁纸图像的方式)。

所以背景图像需要重新缩放,动画也需要重新缩放到背景图像的确切百分比,并且它们需要位于特定的 x 和 y 位置。

任何帮助将不胜感激,所以我可以做到这一点。


我厌倦了一些东西,想我会为所有东西做一个缩放器,例如:int scaler; 然后在 onSurfaceChanged scaler = width /1024; //如果更大的图像是 1024。这将给我一个可以在任何地方使用的比率。然后使用 scaleBitmap 通过将缩放器乘以图像的高度和宽度进行相应缩放,并使用相同的缩放器来定位示例图像 x 假设为 50,使用相同的东西缩放它 x = scaler * 50; 应该注意缩放和定位,下一课是如何将所有这些转换成java,因为我是java新手,我曾经为flash和php编程,但这有很大不同,需要一些时间来适应. 接下来是如何平移宽度,当您从一侧移动到另一侧屏幕时,如何使图像显示是我想出的下一个难题。现在它只是显示相同的宽度,即使宽度是表面显示的两倍。如果您得到答案或在某个地方我可以找到有关此问题的信息,将不胜感激。

4

2 回答 2

12

嗯,嗯,我只能说“欢迎来到现实世界”。您可以通过 onSurfaceChanged 将屏幕尺寸传递给您,是的,您的工作是弄清楚如何根据这些数据缩放所有内容。这就是为什么他们付给我们大笔钱的原因。:-) 您将需要确保您的资源足够大以适合您打算支持的最大显示器,因此您将始终缩小事物(与扩展事物相比,扭曲程度要小得多)。

建议从此处的“屏幕独立性最佳实践”开始:http: //developer.android.com/guide/practices/screens_support.html

在您请求更多帮助时的其他评论...

  1. 您不能(必然)仅使用宽度来缩放您的作品,因为您需要支持多种纵横比。如果屏幕比例与您的作品不匹配,您必须决定是否要扭曲您的作品、留下空白等。
  2. 我不确定如何解释您在传递屏幕尺寸时遇到的麻烦。我们大多数人将所有活动代码放在一个引擎类中,因此我们的方法可以通过私有变量共享数据。例如,在 SDK 中的 Cube 壁纸中,onSurfaceChanged() 设置 mCenterX 以供以后在 drawCube() 中使用。我建议从类似的简单方法开始。
  3. 处理滚动需要一些“智能”并仔细评估您通过 onOffsetsChanged() 收到的数据。xStep 指示您的启动器支持多少屏幕。通常 xStep 为 0.25,表示 5 个屏幕(即 xOffset = 0、0.25、0.5、0.75 或 1),但它可以是 0 到 1 之间的任何值;0.5 表示 3 个屏幕。xPixels 可以告诉您启动器“希望”您根据您所在的屏幕移动图像的程度;通常你应该尊重这一点。在我的手机上,启动器“想要”一个虚拟壁纸,其像素是物理屏幕的两倍,因此每个滚动都应该只移动一个屏幕像素的四分之一。所有这些以及更多内容都记录在http://developer.android.com/reference/android/app/WallpaperManager.html 这不是“简单”的编码——应用程序比壁纸更容易。:-)

祝你好运……乔治

PS我再补充一件事:沿着这条线的某个地方,您可能想要检索启动器所需的壁纸的“所需最小宽度”,这样您就可以明确理解xPixels中隐含的虚拟化。例如,在我的引擎构造函数中,我有

mContext = getApplicationContext();
mWM = WallpaperManager.getInstance(mContext);
mDW = mWM.getDesiredMinimumWidth();

我的设备有 320 像素宽度;我得到 mDW = 640; 当我从一个屏幕滚动到另一个屏幕时,xPixels 每次更改 80...因为四个滚动(跨越五个屏幕)应该使显示的艺术品数量增加一倍(这种效果称为“视差滚动”)。最右边的部分有 xPixels 等于 0;(五个)部分的中心有 xPixels = -160 等。

于 2011-03-18T02:47:46.073 回答
-1

我已经使用此代码片段来缩放一张图像以适应不同的屏幕尺寸。

Bitmap image1, pic1;
image1 = BitmapFactory.decodeResource(getResources(), R.drawable.image1);
float xScale = (float) canvas.getWidth() / image1.getWidth();
                float yScale = (float) canvas.getHeight() / image1.getHeight();
                float scale = Math.max(xScale, yScale); //selects the larger size to grow the images by

                //scale = (float) (scale*1.1); //this allows for ensuring the image covers the whole screen.

                scaledWidth = scale * image1.getWidth();
                scaledHeight = scale * image1.getHeight();

                    pic1 = Bitmap.createScaledBitmap(image1, (int)scaledWidth, (int)scaledHeight, true);

确保边缘不包含重要信息,因为它会在某些屏幕比例下超出图片的比例。

于 2012-10-20T09:12:56.997 回答