正如前面AbstractBoard类的代码中看到的,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法将会随机从res\
drawable-mdpi目录下取得N张图片。
为了让getPlayImages()方法从res\drawable-mdpi目录下随机取得N张图片,程序的实现思路可分为如下几步:
1.通过反射来获取R.drawable的所有Field(Android的每张图片资源都会自动转换为R.drawable的静态Field),并将这些Field值添加到一个List集合中。
2.从第一步得到的List集合中随机“抽取”N/2个图片ID。
3.将第二步得到的N/2个图片ID全部复制一份,这样就得到了N个图片ID,而且每个图片ID都可以找到与之配对的。
4.将第三步得到的N个图片ID再次“随机打乱”,并且根据图片ID加载相应的Bitmap对象,最后把图片ID及对应的Bitmap封装成PieceImage后返回。
ImageUtil类的代码如下:src\org\crazyit\link\util\ImageUtil.java
1 public class ImageUtil
2 {
3 // 保存所有连连看图片资源值(int类型)
4 private static List<Integer> imageValues = getImageValues();
5
6 //获取连连看所有图片的ID(约定所有图片ID以p_开头)
7 public static List<Integer> getImageValues()
8 {
9 try
10 {
11 // 得到R.drawable所有的属性, 即获取drawable目录下的所有图片
12 Field[] drawableFields = R.drawable.class.getFields();
13 List<Integer> resourceValues = new ArrayList<Integer>();
14 for (Field field : drawableFields)
15 {
16 // 如果该Field的名称以p_开头
17 if (field.getName().indexOf("p_") != -1)
18 {
19 resourceValues.add(field.getInt(R.drawable.class));
20 }
21 }
22 return resourceValues;
23 }
24 catch (Exception e)
25 {
26 return null;
27 }
28 }
29
30 /**
31 * 随机从sourceValues的集合中获取size个图片ID, 返回结果为图片ID的集合
32 *
33 * @param sourceValues 从中获取的集合
34 * @param size 需要获取的个数
35 * @return size个图片ID的集合
36 */
37 public static List<Integer> getRandomValues(List<Integer> sourceValues,
38 int size)
39 {
40 // 创建一个随机数生成器
41 Random random = new Random();
42 // 创建结果集合
43 List<Integer> result = new ArrayList<Integer>();
44 for (int i = 0; i < size; i++)
45 {
46 try
47 {
48 // 随机获取一个数字,大于、小于sourceValues.size()的数值
49 int index = random.nextInt(sourceValues.size());
50 // 从图片ID集合中获取该图片对象
51 Integer image = sourceValues.get(index);
52 // 添加到结果集中
53 result.add(image);
54 }
55 catch (IndexOutOfBoundsException e)
56 {
57 return result;
58 }
59 }
60 return result;
61 }
62
63 /**
64 * 从drawable目录中中获取size个图片资源ID(以p_为前缀的资源名称), 其中size为游戏数量
65 *
66 * @param size 需要获取的图片ID的数量
67 * @return size个图片ID的集合
68 */
69 public static List<Integer> getPlayValues(int size)
70 {
71 if (size % 2 != 0)
72 {
73 // 如果该数除2有余数,将size加1
74 size += 1;
75 }
76 // 再从所有的图片值中随机获取size的一半数量
77 List<Integer> playImageValues = getRandomValues(imageValues, size / 2);
78 // 将playImageValues集合的元素增加一倍(保证所有图片都有与之配对的图片)
79 playImageValues.addAll(playImageValues);
80 // 将所有图片ID随机“洗牌”
81 Collections.shuffle(playImageValues);
82 return playImageValues;
83 }
84
85 /**
86 * 将图片ID集合转换PieceImage对象集合,PieceImage封装了图片ID与图片本身
87 *
88 * @param context
89 * @param resourceValues
90 * @return size个PieceImage对象的集合
91 */
92 public static List<PieceImage> getPlayImages(Context context, int size)
93 {
94 // 获取图片ID组成的集合
95 List<Integer> resourceValues = getPlayValues(size);
96 List<PieceImage> result = new ArrayList<PieceImage>();
97 // 遍历每个图片ID
98 for (Integer value : resourceValues)
99 {
100 // 加载图片
101 Bitmap bm = BitmapFactory.decodeResource(
102 context.getResources(), value);
103 // 封装图片ID与图片本身
104 PieceImage pieceImage = new PieceImage(bm, value);
105 result.add(pieceImage);
106 }
107 return result;
108 }
109
110 // 获取选中标识的图片
111 public static Bitmap getSelectImage(Context context)
112 {
113 Bitmap bm = BitmapFactory.decodeResource(context.getResources(),
114 R.drawable.selected);
115 return bm;
116 }
117 }