通过 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 的值,其中Nindex 给出的数字。

有关更多信息,请参阅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 动态获取可绘制对象的主要内容,如果未能解决你的问题,请参考以下文章

使用canvas绘制时钟并通过class面向对象

动态设置可绘制文件夹中的ImageView

如何在代码中获取 attr 引用?

dskinlite(uieasy mfc界面库)使用记录2:绘制动态元素(按钮控件绘制元素动态控制,改变图片和文字)

django模型,如何动态设置查询的字段?

JS 动态表格