2

我正在尝试创建位图

 BitmapDrawable img = new BitmapDrawable(getResources(), "res/drawable/wrench.png");
 Bitmap wrench = img.getBitmap();
 //Bitmap wrench = BitmapFactory.decodeResource(getResources(), R.drawable.wrench);
 canvas.drawColor(Color .BLACK);
 Log.d("OLOLOLO",Integer.toString(wrench.getHeight()));
 canvas.drawBitmap(wrench, left, top, null);

但是当我调用wrench.getHeight()时,程序因 NullPoinerException 而失败。(我将文件放在可绘制目录中)我该如何解决我的问题?

4

3 回答 3

2

试试这个:

            Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.wrench);  
            Matrix matrix=new Matrix();
            matrix.postScale(0.2f, 0.2f);
            Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),
            bmp.getHeight(),matrix,true);
            canvas.drawColor(Color.BLACK);  
            canvas.drawBitmap(dstbmp, 10, 10, null);  

“res/drawable/wrench.png”路径无效,因此如果您使用可绘制的图像,请使用 sbcard 中的图像,然后使用R.drawable.wrench

无法获取存储在 drawable 中的图像的确切路径。

为什么不?当您将应用程序编译为 *.apk 文件时,所有资源(好的,除了 /raw 中的资源)也会被编译。您只能使用它们的 R. id 访问它们。

解决方案?不是真的,例如,您可以将它们复制到 SD 卡上的某个位置。不,你知道位置:)

于 2012-04-11T20:22:58.240 回答
2

好的...我想我现在可以解决您的问题了。就像我说的,你不能通过路径访问你的drawables,所以如果你想要一个可以通过编程方式构建的drawables的人类可读界面,请在你的类的某个地方声明一个HashMap:

private static HashMap<String, Integer> images = null;

然后在你的构造函数中初始化它:

public myClass() {
  if (images == null) {
    images = new HashMap<String, Integer>();
    images.put("Human1Arm", R.drawable.human_one_arm);
    // for all your images - don't worry, this is really fast and will only happen once
  }
}

现在访问 -

String drawable = "wrench";
// fill in this value however you want, but in the end you want Human1Arm etc
// access is fast and easy:
Bitmap wrench = BitmapFactory.decodeResource(getResources(), images.get(drawable));
canvas.drawColor(Color .BLACK);
Log.d("OLOLOLO",Integer.toString(wrench.getHeight()));
canvas.drawBitmap(wrench, left, top, null);
于 2012-04-11T20:47:43.133 回答
1

你可以这样做:

String imageNameWithoutExtension = "wrench";
int id = getResources().getIdentifier(imageNameWithoutExtension, "drawable", getPackageName());
Bitmap dd = BitmapFactory.decodeResource(getResources(), id);
logo.setImageBitmap(dd);
于 2012-04-11T20:52:38.567 回答