博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
疯狂连连看之加载界面的图片
阅读量:5139 次
发布时间:2019-06-13

本文共 3012 字,大约阅读时间需要 10 分钟。

 

正如前面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)》一书。

图书详细信息:

转载于:https://www.cnblogs.com/broadview/archive/2011/07/15/2107637.html

你可能感兴趣的文章
web开发的三层架构
查看>>
Idea 常用快捷键列表
查看>>
让xamarin的Entry绑定时,支持Nullable类型
查看>>
linux 中安装JDK
查看>>
高精度加法和乘法
查看>>
SQL 语句的执行顺序
查看>>
SQL 参数化查询 应用于 Like
查看>>
[CareerCup] 2.3 Delete Node in a Linked List 删除链表的节点
查看>>
[LeetCode] Find K Pairs with Smallest Sums 找和最小的K对数字
查看>>
左右轮播无缝效果
查看>>
HTML 链接是通过 <a> 标签进行定义的
查看>>
Cocos2d Box2D之静态刚体
查看>>
UDP和TCP两种协议的传输数据长度分析
查看>>
ppt 例题8 多重背包2
查看>>
倒序--逆序=2
查看>>
Java中的Nested Classes和Inner Classes
查看>>
自动创建文件夹的两种方法
查看>>
graphviz入门
查看>>
[Js-Java SE]异常结构继承图
查看>>
信度不达标的处理方式
查看>>