通过 ID 动态获取可绘制对象
Posted
技术标签:
【中文标题】通过 ID 动态获取可绘制对象【英文标题】:Dynamically get drawables by ID 【发布时间】:2011-01-25 17:28:11 【问题描述】:我想获取 byte
并将其附加到资源 ID 中,以便能够获取与游戏中编号牌组相对应的图像。在其他设备上使用路径很容易,但使用资源 ID 我不确定如何去做。
这是我现在拥有的:
switch(GameSettings.gameDeck)
case 1:
deckImage.setBackgroundResource(R.drawable.deck1);
break;
case 2:
deckImage.setBackgroundResource(R.drawable.deck2);
break;
case 3:
deckImage.setBackgroundResource(R.drawable.deck3);
break;
case 4:
deckImage.setBackgroundResource(R.drawable.deck4);
break;
在我的黑莓版本中,我只有:
deckImage.setBitmap(Bitmap.getBitmapResource("/path/deck" + GameSettings.gameDeck + ".png"));
有没有办法在 android 上使用资源 ID 完成类似的事情?
【问题讨论】:
【参考方案1】:使用Context
中的getResources().getIdentifier()
(例如Activity
),但如果您将多次使用它,请缓存结果。 getIdentifier()
在 Resources
上实现。
例如:
int drawableId=getResources().getIdentifier("foo"+index, "drawable", getPackageName());
将返回R.drawable.fooN
的值,其中N
是index
给出的数字。
有关更多信息,请参阅this 和 this 和 this。
【讨论】:
改进这个答案:Bitmap myImage = BitmapFactory.decodeResource(getResources(), R.drawable.myImageName); 你会如何推荐缓存,LruCache? @mattblang:ID 只是整数,您不应该拥有数百万个 ID。因此,在大多数情况下,普通数据成员(甚至循环外的局部变量)就足够了。 @CommonsWare 对不起,我指的是drawables。 @mattblang:这个问题是关于资源 ID,而不是可绘制对象。对于位图,由于 Dalvik 的非压缩垃圾收集器,理想情况下您应该通过inBitmap
在对象池中重用这些 Bitmap
对象。如果你不能这样做,那么LruCache
或类似的东西是一个不错的选择。只要确保如果您使用的是图像处理库(例如,毕加索),您没有冗余缓存内容。【参考方案2】:
在您的情况下,图像可绘制名称在开始字符处相同,不同的是数字。所以当你的应用程序被编译时。为您的可绘制名称生成的 id 是一系列连续增量。 这些是我将可绘制对象命名为与您的示例代码相同时生成的 ID
int drawable deck1 0x7f07007a //convert hex to decimal = 2131165306
int drawable deck2 0x7f07007b //convert hex to decimal = 2131165307
int drawable deck3 0x7f07007c //convert hex to decimal = 2131165308
int drawable deck4 0x7f07007d //convert hex to decimal = 2131165309
您可以查看android studio生成的R.txt文件。
所以简单的解决方案是:
int deckId = R.drawable.deck1 + GameSettings.gameDeck - 1
deckImage.setImageResource(deckId)
【讨论】:
以上是关于通过 ID 动态获取可绘制对象的主要内容,如果未能解决你的问题,请参考以下文章