安卓动态壁纸重新缩放

3

我正在学习如何制作动态壁纸,但是我遇到了一个困境,我相信所有刚开始学习的人都会遇到这个问题。

屏幕分辨率大小如此之多,我怎么能只制作一套艺术品并在代码中重新调整大小以适应所有版本呢?我知道已经有人做过了,因为我在很多apk中看到了这些图像,并且它们被重新缩放。

如果只是一个不需要任何定位的图像,那就很容易了,但我的问题是,我必须将背景图像重新缩放以适应所有设备,我还有一些动画,这些动画适合于特定的x和y位置在背景图像上适当地放置,以便看起来整个背景都在动画,但只有部分是(这是我避免使用300张一帧一帧的动态壁纸的方法)。

因此,背景图像需要重新缩放,动画也需要按照背景图像的精确百分比进行缩放,并且它们需要坐落在特定的x和y位置。

如果您能提供任何帮助,我将不胜感激,这样我就可以开始制作动态壁纸了。


我尝试了一些东西,想为所有内容制作一个缩放器示例:int scaler; 然后在onSurfaceChanged中,scaler = width /1024; //如果较大的图像是1024.那么这将给我一个比例在任何地方都可以使用。然后使用scaleBitmap按比例缩放通过将scaler乘以图像高度和宽度,并且还使用相同的缩放器来定位,例如图像x在50处,使用相同的方法进行缩放x = scaler * 50; 这应该解决了缩放和定位问题,接下来要将所有这些内容翻译成Java,因为我是Java新手,我曾经编写过Flash和PHP程序,但这与此有很大不同,需要一些时间适应。下一件事是如何平移宽度,当您从一侧向另一侧移动屏幕时如何使图像显示出来,这是我接下来要解决的难题。现在它只显示相同的宽度,无论宽度是表面的两倍。如果您有答案或者可以告诉我在哪里找到这个信息,我将不胜感激。

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 中有详细说明。这不是“易于编码”的内容——应用程序要比壁纸容易些。:-)
祝好运...George P.S. 我再补充一件事:在某个时候,您可能想检索启动器所需的壁纸的“期望最小宽度”,以便可以明确地了解xPixels中隐含的虚拟化。例如,在我的引擎构造函数中,我有
mContext = getApplicationContext();
mWM = WallpaperManager.getInstance(mContext);
mDW = mWM.getDesiredMinimumWidth();

我的设备宽度为320像素;我得到mDW = 640;随着我从一个屏幕滚动到另一个屏幕,xPixels每次改变80……因为四个滚动(横跨五个屏幕)应该使展示的艺术品数量翻倍(这种效果称为“视差滚动”)。最右边的部分 xPixels 等于0;中间(第五部分)xPixels = -160,等等。


在onOffsetChange方法中,您将获得xPixelOffset值,该值告诉您如果您的图片宽度等于desiredMinimumWidth,则需要移动画布多少。从这个值可以计算出实际偏移量:actualXOffset =(yourBitmap.getWidth()-screenWidth)/(desiredMinimumWidth-screenWidth)* xPixelOffset。 - CloudWalker

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

请确保边缘没有包含重要信息,因为在某些屏幕比例下,它们将被缩放出图片。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接