疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

android开发—连连看开发技巧(5)


 

android游戏开发之连连看(5)

加载界面的图片

        正如前面AbstractBoard类的代码中看到的,当程序需要创建个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法将会随机从resdrawable-mdpi目录下取得N张图片。

        为了让getPlayImages()方法从resdrawable-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类的代码:

程序清单:codes18LinksrcorgcrazyitlinkutilImageUtil.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讲义.李刚])