【IT168技术】本文是Android游戏开发系列的第四篇,主要给大家介绍如何加载界面的图片。正如前面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类的代码。
程序清单:codes\18\Link\src\org\crazyit\link\util\ImageUtil.java
public class ImageUtil
{
// 保存所有连连看图片资源值(int类型)
private static List<Integer> imageValues = getImageValues();
//获取连连看所有图片的ID(约定所有图片ID以p_开头)
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有余数,将size加1
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 size个PieceImage对象的集合
*/
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;
}
}
{
// 保存所有连连看图片资源值(int类型)
private static List<Integer> imageValues = getImageValues();
//获取连连看所有图片的ID(约定所有图片ID以p_开头)
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有余数,将size加1
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 size个PieceImage对象的集合
*/
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;
}
}
▲图书封面