我在支持多个Android设备方面做了很多阅读。我的印象是,如果我没有为特定的dpi文件夹创建一个drawable,那么Android会自动获取最接近的文件夹并进行缩放。我有一张我用于XXHDPI的精灵表。它在我的Galaxy S4上运行得很好,但是当我使用带有HDPI屏幕的Nexus 7在模拟器上运行应用程序时,似乎精灵表没有完美缩放。宽度稍微偏离,所以不是看到精灵动画的整个帧,而是在错误的位置切断,所以我看到当前帧的左半部分和前一帧的右半部分。我在Flash中制作的精灵表,因此很容易返回并缩放矢量以生成HDPI文件夹的第二张表。像这样手动修复问题。但我宁愿没有5张纸,因为这会增加文件大小。那究竟是什么问题的根源呢?有没有更好的方法在运行时缩放图像,是因为模拟器不是像素完美,或者Android缩放方法不精确吗?
src = new Rect(frame * width, 0, (frame + 1) * width, height);
dst = new Rect(x, y, x + width, y + height);
canvas.drawBitmap(bmp, src, dst, null);
在对象的构造函数中我有:
width = bmp.getWidth() / 5;
height = bmp.getHeight();
我将每个帧的宽度设置为(1/5)位图的宽度,因为有5个帧。
修改
我已经确定问题是,当Android缩放精灵表时,大小当然会被强制转换为整数。例如,XXHDPI的工作表宽度为575.它可被5整除,因此在XXHDPI中效果很好,但当缩放到HDPI(XXHDPI大小的一半)时,它保存为287,不能被整除所以第一帧很好,下一个是像素,下一个是2,依此类推。这会传播并使后面的帧看起来非常糟糕。
答案 0 :(得分:0)
要避免android缩放源图像,请将其放在assets文件夹中。 这意味着您无法通过它的ID加载资源,因此您需要使用以下方法手动执行此操作:
public static Bitmap getBitmapFromAssets(Context context, String filePath) {
AssetManager assetManager = context.getAssets();
InputStream inStream;
Bitmap bitmap = null;
try {
inStream = assetManager.open(filePath);
bitmap = BitmapFactory.decodeStream(inStream);
} catch (IOException e) {
// handle exception
}
return bitmap;
}
注意:根据您的IDE,您可能已经或可能没有为您创建资产文件夹。
然后,如果需要,可以在获取所需精灵表区域的位图之后进行自己的缩放。您可以使用以下方法进行自己的屏幕尺寸检测:
int screenSize = context.getResources().getConfiguration().screenLayout;
screenSize &= Configuration.SCREENLAYOUT_SIZE_MASK;
switch (screenSize) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
// scale for small
break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
// scale for normal
break;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
// scale for large
break;
case 4: Configuration.SCREENLAYOUT_SIZE_XLARGE // If your min sdk is >= 9
// scale for xlarge
break;