我该如何处理动态壁纸,以便支持多种宽高比?

时间:2013-09-27 16:58:07

标签: android canvas bitmap android-animation live-wallpaper

我有一个动态壁纸全部设置(为简单起见,假设它由两个并排放置的旋转位图组成,每个位图以不同的速度旋转;还要注意位图的边缘(不是图像周围的隐形框,而是绘图的实际像素)正在接触。)

我将每个的翻译描述为画布大小的百分比(0到1之间的值乘以c.getHeight()和c.getWidth()(其中c是画布)。)

无论如何,只要保持宽高比,一切都能正常工作。所以xxhdpi和xhdpi @ 1080x1920和720x1280都很好,但是当我在nexus s @ 480x800上运行它时,两个位图不再正确定位。

我不想扭曲我的图像(它们是圆形,必须保持圆形),所以我认为最好的方法是限制画布的大小并使其居中。

所以对于nexus的@ 480x800,我实际上只想画一个450x800的区域,我会在屏幕上居中。

事实上,我总是希望在一个区域内有2个位图,高度=宽度* 0.5625。

我该怎么做呢?

注意:我根据立方体样本制作了动态壁纸。

如果我遗漏任何重要细节,请告诉我,

谢谢!

沃纳

1 个答案:

答案 0 :(得分:0)

在您的引擎内部,执行以下操作以捕获屏幕的高度和宽度

int screenHeight, screenWidth;
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    super.onSurfaceChanged(holder, format, width, height);
    screenHeight = height; screenWidth = width;
}

无论你在哪里解码你的位图,都要这样做: -

//get bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bitmap);

//scale bitmap
bitmap = Bitmap.createScaledBitmap(bitmap, screenWidth, screenWidth * 0.5625, true);

这会在整个屏幕上显示一个正确宽高比(宽* 0.5625)的圆圈。

然后让它居中: -

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
final SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = holder.lockCanvas();

int x = ( screenHeight - screenWidth*0.5625 ) / 2;

canvas.drawBitmap(bitmap, 0, x, paint);