Android 我应该如何处理实时壁纸,使其支持多个纵横比?

Android 我应该如何处理实时壁纸,使其支持多个纵横比?,android,canvas,bitmap,android-animation,live-wallpaper,Android,Canvas,Bitmap,Android Animation,Live Wallpaper,我设置了一张实时壁纸(为了简单起见,假设它由两个并排放置的旋转位图组成,每个位图以不同的速度旋转;还要注意位图的边缘(不是图像周围的不可见框,而是图形的实际像素)是相互接触的。) 我以画布大小的百分比(0到1之间的值乘以c.getHeight()和c.getWidth()(其中c是画布)来描述每个对象的转换。) 无论如何,只要保持纵横比,一切都正常。所以xxhdpi和xhdpi@1080x1920和720x1280都很好,但是当我在nexus s@480x800上运行它时,这两个位图不再正确定位

我设置了一张实时壁纸(为了简单起见,假设它由两个并排放置的旋转位图组成,每个位图以不同的速度旋转;还要注意位图的边缘(不是图像周围的不可见框,而是图形的实际像素)是相互接触的。)

我以画布大小的百分比(0到1之间的值乘以c.getHeight()和c.getWidth()(其中c是画布)来描述每个对象的转换。)

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

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

所以对于nexus s@480x800,我实际上只想画一个450x800区域,我会把它放在屏幕的中心

事实上,我总是希望我的2个位图位于高度=宽度*0.5625的区域

我该怎么做呢

注:我的实时墙纸基于立方体样本

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

谢谢大家!


Werner

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

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