2010-08-16 24 views
6

मैं छवियों के समूह से एक यादृच्छिक छवि प्रदर्शित करना चाहता हूं जिसे मैंने res/drawable में संग्रहीत किया है।संसाधनों से यादृच्छिक रूप से चयन कैसे करें (R.drawable.xxxx)

एकमात्र तकनीक जिसे मैं जानता हूं वह एक विशेष छवि तक पहुंचना है यदि आप इसकी संसाधन आईडी जानते हैं। क्या फ़ाइल नाम या कुछ और (जिसे रनटाइम पर बनाया जा सकता है) का उपयोग करके छवियों तक पहुंचने का कोई तरीका है?

मैं रनटाइम पर यादृच्छिक रूप से एक छवि का चयन करना चाहता हूं। कोई सुझाव/विचारों की सराहना की :)

धन्यवाद चिन्मय

उत्तर

3

आप नाम से संसाधनों तक पहुंच सकते हैं, जो कि यदि आप संसाधनों के नाम जानते हैं या उन्हें कुछ पूर्व परिभाषित नामकरण योजना के अनुसार प्राप्त कर सकते हैं तो आपकी समस्या को हल करने के लिए एक व्यवहार्य दृष्टिकोण हो सकता है।

आपको Resources कक्षा के getIdentifier विधि का उपयोग करके पहचानकर्ता को नाम मैप करना होगा।

String name = "resource" + rng.nextInt(count); 
int resource = getResources().getIdentifier(name, "drawable", "com.package"); 

इस विधि के लिए प्रलेखन कहते हैं:

नोट: इस समारोह के उपयोग हतोत्साहित है। नाम से पहचानने वाले द्वारा संसाधनों को पुनर्प्राप्त करने के लिए यह अधिक कुशल है।

यह सच है लेकिन यदि आप कोड में ऐसा कर रहे हैं जो प्रदर्शन संवेदनशील नहीं है तो कोई समस्या नहीं है।

वैकल्पिक रूप से, यदि आपको XML में संसाधनों को सूचीबद्ध करने में कोई बात नहीं है, तो आप a typed array बना सकते हैं जिसे आप यादृच्छिक रूप से चुन सकते हैं।

1

मैं कुछ भी आप कार्यावधि में क्या कर सकते हैं के बारे में सोच नहीं कर सकते। आप संभवतः पता पूर्णांक की एक सरणी बना सकते हैं (क्योंकि R.drawable.xxxx अनिवार्य रूप से एक पूर्णांक पता है) और फिर अपने सरणी से यादृच्छिक संसाधन पता चुनने के लिए java.util.Random का उपयोग करें।

+0

मैंने इस बारे में सोचा था ... लेकिन जब भी मैं अपने res/निर्देशिका में कुछ छवियां जोड़ता हूं तो मैं कोड को बदलना नहीं चाहता हूं। –

+0

मेरा मानना ​​है कि माया का जवाब है। – bporter

2

res/drawable में आइटम संकलन समय पर R.drawable वर्ग में उल्लिखित हैं। आप उस वर्ग के सदस्यों की सूची प्राप्त करने के लिए शायद reflection का उपयोग कर सकते हैं, और उसके बाद उस सूची से यादृच्छिक रूप से चयन करें।

+1

मैंने अभी यह कोशिश की और संसाधन नामों की एक सूची प्राप्त करने में सक्षम था - उनके मूल्य को वापस करने के लिए केवल एक और कदम की आवश्यकता होगी। मैं देख सकता था कि प्रतिबिंब काम करता था। महान सुझाव माया! फील्ड नाम प्राप्त करने के लिए कोड की रेखा यहां दी गई है: java.lang.reflect.Field [] फ़ील्ड = R.drawable.class.getFields(); – bporter

0

आप पता था कि आप random.nextInt (एक्स) इस्तेमाल कर सकते हैं से बेतरतीब ढंग से बीच का एक पूर्णांक उत्पन्न करने के लिए चुनने के लिए एक्स छवियों था 0 (सम्मिलित) और एक्स (अनन्य), फिर उस पर स्विच अपने संसाधन लेने के लिए:

Random mRand = new Random(); 
      int x = mRand.nextInt(8); 
      switch (x) { 
      case 0: 
       mResource = R.id.someresource1 
      case 1: 
       mResource = R.id.someresource2 
      ... 
      case X: 
       mResource = R.id.someresourceX 

      } 
+0

यह अनिवार्य रूप से बोर्टर सुझाव देने का एक और जटिल तरीका है, मैं इसके बजाय उस विधि का उपयोग करने की सिफारिश करता हूं, यह कठिन है। – QRohlf

0

मैंने कभी भी एसेटमैनेजर का उपयोग नहीं किया है, लेकिन क्या आप अपने संसाधन वर्ग पर getAssets को कॉल करने में सक्षम होंगे, और फिर अपने संसाधनों के स्थान के साथ AssetManager पर कॉल सूची कॉल कर पाएंगे?

0

यदि आपको <level-list> एक्सएमएल फ़ाइल सेट करने की कोई बात नहीं है, तो आपको LevelListDrawable का उपयोग करने में सक्षम होना चाहिए और setImageLevel() पर अपने यादृच्छिक संख्या के साथ कॉल करना चाहिए।

यदि आप फ़ाइलों को जोड़ते समय इस सूची को बदलना नहीं चाहते हैं, तो मुझे लगता है कि एक बिल्ड इवेंट स्थापित करने का कोई तरीका है जहां आप इस फ़ाइल को प्रोग्रामेटिक रूप से उत्पन्न कर सकते हैं।

0

मैंने इसे अपने ऐप्पलज़ एप्लिकेशन में निम्नानुसार किया;

1) छवियों को पकड़ने और इसे भरने के लिए एक ArrayList बनाएं 2) यादृच्छिक संख्या लें और इसी छवि को वापस करें।

public static void fruitInventory() { 
fruitResources.clear(); 
Field[] fields = R.drawable.class.getFields(); 

for (Field field : fields) { 
    // Take only those with name starting with "fr" 
    if (field.getName().startsWith("fr_")) { 
     try { 
      String FType = field.getName().substring(3); 

      fruitResources.add(field.getInt(null)); 
      alfruitTypes.add(FType); 
      Log.d("FruitManager", "Type " + FType); 

     } catch (IllegalArgumentException e) { 

      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 

      e.printStackTrace(); 
     } 
    } 


} 

और फल जोड़ने के लिए:

public static void addFruit(Context context){ 

fruitInventory(); 

for (int i = 0; i < 10; i++) { 
Random Rnd = new Random(); 
int FruitType = Rnd.nextInt(fruitResources.size()); 
GameObject nextApple = new GameObject(BitmapFactory.decodeResource(context.getResources(), 
        fruitResources.get(FruitType)), FruitType); 

MainGamePanel.AppleList.add(nextApple); 
} 

}

आइडिया था (और काम करता है) कि मैं खेल के लिए अतिरिक्त फल जोड़ सकता है, बस द्वारा

कोड में

छवियों फ़ोल्डर में उदाहरण के लिए "fr_eggplant.bmp" जोड़ना।

12

मुझे एहसास है कि यह एक बहुत पुराना सवाल है, लेकिन किसी भी Googlers के लिए एक अच्छा समाधान प्रदान करना चाहता था।

नाम से संसाधनों का उपयोग आईडी से बहुत कम कुशल है। संसाधन प्रणाली का पूरा बिंदु यह है कि आपको नामों को हल करने की आवश्यकता नहीं है, और इसके बजाय आईडी का उपयोग कर सकते हैं।

आपको क्या करना है Array Resource प्रकार का उपयोग करना है। मेरे आसान चरणों के साथ पालन करें! मैं यादृच्छिक छवियां बना देता हूं ... मज़ा!

  1. एक सरणी संसाधन बनाएं जिसमें सभी छवियां शामिल हैं जिन्हें आप चुनना चाहते हैं। मैंने इसे अपने res/values/arrays.xml फ़ाइल में रखा लेकिन यह वास्तव में कहीं भी जा सकता है।

    <array name="loading_images"> 
        <item>@drawable/bg_loading_1</item> 
        <item>@drawable/bg_loading_2</item> 
        <item>@drawable/bg_loading_3</item> 
        <item>@drawable/bg_loading_5</item> 
        <item>@drawable/bg_loading_6</item> 
        <item>@drawable/bg_loading_7</item> 
        <item>@drawable/bg_loading_8</item> 
    </array> 
    
  2. इसके बाद, Resources से TypedArray हो और का उपयोग करें कि एक यादृच्छिक छवि चुनने के लिए।

    TypedArray images = getResources().obtainTypedArray(R.array.loading_images); 
    int choice = (int) (Math.random() * images.length()); 
    mImageView.setImageResource(images.getResourceId(choice, R.drawable.bg_loading_1)); 
    images.recycle(); 
    
  3. लाभ!

संबंधित मुद्दे