我是Android Studio的新手,在与BitmapFactory相关的任务中我特别困惑的一切。
我遇到的问题如下。当我在drawable文件夹下插入尺寸为(578x496)的jpg文件时,我就这样做了
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.background1));
Log.e("WIDTH", String.valueOf(mBitmap.getWidth());
Log.e("HEIGHT", String.valueOf(mBitmap.getHeight());
我得到的是(2312x1984)的维度,其大小比实际维度大x4。是因为我的文件格式为jpg而不是png?
所以我决定做的是
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.background1,options));
然后将其设置为我的SurfaceView的背景,
public class GamePanel extends SurfaceView implements SurfaceHolder.Callback {
public static final int WIDTH=578;
public static final int HEIGHT=496;
....
@Override
public void draw(Canvas canvas){
final int scaleXFactor = getWidth()/WIDTH;
final int scaleYFactor = getHeight()/HEIGHT;
if(canvas!=null){
final int savedState = canvas.save();
canvas.scale(scaleXFactor,scaleYFactor);
bg.draw(canvas);
canvas.restoreToCount(savedState);
}
}
但是这个canvas.scale(scaleXFactor,scaleYFactor)只允许背景水平放置而不是垂直放置。所以它就像
--------------------------------------
| IMG |
| |
|-------------------------------------| <-Viewed as "Landscape"
| Black Empty Screen |
| |
|-------------------------------------|
到目前为止,我的理解是Bitmap在Android Studio制作的任何类型的应用程序中都是非常重要的概念,如果没有正确实现,它会导致应用程序因OOM错误而崩溃或简单地降低应用程序的速度。请让我了解这位可怜的人,那里的专家。
答案 0 :(得分:1)
如果您在/res/drawable
或/res/drawable-mdpi
文件夹中有图片,并且您在密度为BitmapFactory.decodeResource()
的设备上致电xxxhdpi
,则BitmapFactory
会向上扩展您的位图,以便在xxxhdpi
屏幕上显示时,它看起来与低密度屏幕上的相同。
如果您确定确实不希望发生这种情况,请将图片放在/res/drawable-nodpi
文件夹中。然后它将在每个平台上以相同的大小进行解码。但是,当您显示图像时,不同密度设备的图像会看起来非常不同。