【问题标题】:Dynamically get drawables by ID通过 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 完成类似的事情?

【问题讨论】:

    标签: java android


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 2011-05-30
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多