我是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错误而崩溃或简单地减慢应用程序。请为我介绍一下这个可怜的人,那里的Maven。
2条答案
按热度按时间yeotifhr1#
当您在
/res/drawable
或/res/drawable-mdpi
文件夹中有一个图像,并且您在具有xxxhdpi
密度的设备上调用BitmapFactory.decodeResource()
时,BitmapFactory
将为您放大位图,以便当您在xxxhdpi
屏幕上显示它时,它看起来与在较低密度屏幕上相同。如果你真的不想看到这种情况发生,请将图像放在
/res/drawable-nodpi
文件夹中。然后,它将在每个平台上以相同的大小进行解码。但是,当你在不同密度的设备上显示图像时,图像看起来会有很大的不同。vtwuwzda2#
BitmapFactory.decodeResource
可以接受类型为BitmapFactory.Options
的第三个参数opts
。您可以设置选项以显式阻止任何缩放:
并使用此附加参数更新您的调用,如下所示:
当您从
bitmap
请求width
和height
时,它将返回true to file值,没有任何缩放。