瘋狂連連看之載入介面的圖片

broadviewbj發表於2011-07-15

 

正如前面AbstractBoard類的程式碼中看到的,當程式需要建立NPiece物件時,程式會直接呼叫ImageUtilgetPlayImages()方法去獲取圖片,該方法將會隨機從res\drawable-mdpi目錄下取得N張圖片。

為了讓getPlayImages()方法從res\drawable-mdpi目錄下隨機取得N張圖片,程式的實現思路可分為如下幾步:

 透過反射來獲取R.drawable的所有FieldAndroid的每張圖片資源都會自動轉換為R.drawable的靜態Field),並將這些Field值新增到一個List集合中。

 從第一步得到的List集合中隨機“抽取”N/2個圖片ID

 將第二步得到的N/2個圖片ID全部複製一份,這樣就得到了N個圖片ID,而且每個圖片ID都可以找到與之配對的。

 將第三步得到的N個圖片ID再次“隨機打亂”,並根據圖片ID載入相應的Bitmap物件,最後把圖片ID及對應的Bitmap封裝成PieceImage後返回。

下面是ImageUtil類的程式碼。

程式清單:codes\18\Link\src\org\crazyit\link\util\ImageUtil.java

public class ImageUtil

{

     // 儲存所有連連看圖片資源值(int型別)

     private static List imageValues = getImageValues();

     //獲取連連看所有圖片的ID(約定所有圖片IDp_開頭)

     public static List getImageValues()

     {

          try

          {

               // 得到R.drawable所有的屬性, 即獲取drawable目錄下的所有圖片

               Field[] drawableFields = R.drawable.class.getFields();

               List resourceValues = new ArrayList();

               for (Field field : drawableFields)

               {

                    // 如果該Field的名稱以p_開頭

                    if (field.getName().indexOf("p_") != -1)

                    {

                          resourceValues.add(field.getInt(R.drawable.class));

                    }

               }

               return resourceValues;

          }

          catch (Exception e)

          {

               return null;

          }

     }

     /**

      * 隨機從sourceValues的集合中獲取size個圖片ID, 返回結果為圖片ID的集合

      * @param sourceValues 從中獲取的集合

      * @param size 需要獲取的個數

      * @return size個圖片ID的集合

      */

     public static List getRandomValues(List sourceValues,

          int size)

     {

          // 建立一個隨機數生成器

          Random random = new Random();

          // 建立結果集合

          List result = new ArrayList();

          for (int i = 0; i < size; i++)

          {

               try

               {

                    // 隨機獲取一個數字,大於、小於sourceValues.size()的數值

                    int index = random.nextInt(sourceValues.size());

                    // 從圖片ID集合中獲取該圖片物件

                    Integer image = sourceValues.get(index);

                    // 新增到結果集中

                    result.add(image);

               }

               catch (IndexOutOfBoundsException e)

               {

                    return result;

               }

          }

          return result;

     }

     /**

      * drawable目錄中獲取size個圖片資源ID, 其中size為遊戲數量

      * @param size 需要獲取的圖片ID的數量

      * @return size個圖片ID的集合

      */

     public static List getPlayValues(int size)

     {

          if (size % 2 != 0)

          {

               // 如果該數除以2有餘數,將size1

               size += 1;

          }

          // 再從所有的圖片值中隨機獲取size的一半數量

          List playImageValues = getRandomValues(imageValues, size / 2);

          // playImageValues集合的元素增加一倍(保證所有圖片都有與之配對的圖片)

          playImageValues.addAll(playImageValues);

          // 將所有圖片ID隨機“洗牌”

          Collections.shuffle(playImageValues);

          return playImageValues;

     }

     /**

      * 將圖片ID集合轉換PieceImage物件集合,PieceImage封裝了圖片ID與圖片本身

      * @param context

      * @param resourceValues

      * @return sizePieceImage物件的集合

      */

     public static List getPlayImages(Context context, int size)

     {

          // 獲取圖片ID組成的集合

          List resourceValues = getPlayValues(size);

          List result = new ArrayList();

          // 遍歷每個圖片ID

          for (Integer value : resourceValues)

          {

               // 載入圖片

               Bitmap bm = BitmapFactory.decodeResource(

                    context.getResources(),  value);

               // 封裝圖片ID與圖片本身

               PieceImage pieceImage = new PieceImage(bm, value);

               result.add(pieceImage);

          }

          return result;

     }

     // 獲取選中標識的圖片

     public static Bitmap getSelectImage(Context context)

     {

          Bitmap bm = BitmapFactory.decodeResource(context.getResources(),

               R.drawable.selected);

          return bm;

     }

}

 瘋狂連連看之載入介面的圖片

本文節選自《瘋狂Android講義(CD光碟1)》一書。

圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-702318

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-702324/,如需轉載,請註明出處,否則將追究法律責任。

相關文章