• 疯狂连连看之加载界面的图片


     

    正如前面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<Integer> imageValues = getImageValues();

         //获取连连看所有图片的ID(约定所有图片IDp_开头)

         public static List<Integer> getImageValues()

         {

              try

              {

                   // 得到R.drawable所有的属性, 即获取drawable目录下的所有图片

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

                   List<Integer> resourceValues = new ArrayList<Integer>();

                   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<Integer> getRandomValues(List<Integer> sourceValues,

              int size)

         {

              // 创建一个随机数生成器

              Random random = new Random();

              // 创建结果集合

              List<Integer> result = new ArrayList<Integer>();

              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<Integer> getPlayValues(int size)

         {

              if (size % 2 != 0)

              {

                   // 如果该数除以2有余数,将size1

                   size += 1;

              }

              // 再从所有的图片值中随机获取size的一半数量

              List<Integer> 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<PieceImage> getPlayImages(Context context, int size)

         {

              // 获取图片ID组成的集合

              List<Integer> resourceValues = getPlayValues(size);

              List<PieceImage> result = new ArrayList<PieceImage>();

              // 遍历每个图片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://www.cnblogs.com/broadview/archive/2011/07/15/2107603.html

  • 相关阅读:
    LeetCode#22 Generate Parentheses
    重传
    数学问题——gcdgcl
    数学问题——十进制转N进制
    数据模型
    IEEE
    格与代数系统
    数据字典
    贪心算法
    群论
  • 原文地址:https://www.cnblogs.com/broadview/p/2107637.html
Copyright © 2020-2023  润新知