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

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

为了让getPlayImages()方法从res\drawable-mdpi目录下随机取得N张图片,程序的实现思路可分为如下几步:

通过反射来获取R.drawable的所有Field(Android的每张图片资源都会自动转换为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(约定所有图片ID以p_开头)

public static List<Integer> getImageValues()

{

try

{

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

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

List<Integer> resourceValues = newArrayList<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 = newArrayList<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 = newArrayList<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://blog.csdn.net/broadview2006/article/details/6609027

疯狂连连看之加载界面的图片相关推荐

  1. 疯狂ios讲义疯狂连载之加载界面的图片

    正如前面FKBaseBoard类的代码中所看到的,当程序需要创建N个FKPiece对象时,程序会直接调用getPlayImages()函数去获取图片,该函数将会随机从项目包下取得N张图片. 为了让ge ...

  2. android开发学习之路——连连看之加载图片(三)

    正如前面AbstractBoard类的代码中看到的,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法将会随机从res\ dra ...

  3. android 动画间隔时间,Android使用View Animation实现动画加载界面

    之前分别介绍了View Animation和Drawable Animation,学了就要用啊,今天给大家一个使用View Animation实现动画加载界面的实现. 首先先看一下实现效果. 下面是实 ...

  4. 【Unity使用UGUI实现王者荣耀UI界面(三)】登录界面以及加载界面优化

    [Unity使用UGUI实现王者荣耀UI界面(三)]登录界面以及加载界面优化 [只是用来玩玩的,不要太当真] 效果显示: zhans 1. 加载界面进度100%跳转登录界面 这个功能好做,只需要将上次 ...

  5. 【用Cocos Creator给暗恋的女生写一个游戏(3)】——游戏加载界面

    恰好今天Creator1.2发布,我们紧跟潮流,就用1.2开始做吧 X给游戏起了一个名字47-21,其中深意自己体会. (其实就是思琪名字的谐音,并且今年是她21岁的生日...当然你也可以理解为思琪爱 ...

  6. ArcMap软件卡在加载界面且闪退无法打开的多种解决办法

      本文介绍ArcMap卡在加载界面,无法打开软件的多种解决方法.   最近,突然发现ArcMap软件打不开了,每次双击快捷方式后其会显示如下所示的加载界面,但是等待很久后加载界面消失,软件窗口却一直 ...

  7. swift 加载gif 框架图片

    swift 加载gif 框架图片 SwiftGifOrigin 以下代码 轻松搞定 let imgView = UIImageView(frame: CGRect(x: 50, y: 100, wid ...

  8. 小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道

    一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片. 问题描述 最近做项目的时候要实现一个上 ...

  9. 解决GitHub加载不出图片问题

    解决GitHub加载不出图片问题 参考文章: (1)解决GitHub加载不出图片问题 (2)https://www.cnblogs.com/jooy/p/12090882.html 备忘一下.

  10. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...

     Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...

最新文章

  1. solidworks的小金球插件_SOLIDWORKS旋转流体仿真
  2. python package和目录_PyCharm中Directory与Python package的区别
  3. ftp可以传输什么类型文件_FTP文件传输工具-ForkLift for Mac
  4. 删除同目录下面txt文件(利用os,fnmacth模块)
  5. python基础知识-python基础知识总结
  6. Ubuntu操作U盘相关
  7. JAVA 前端上传文件,后端解析文件流并写入数据库
  8. java 4.0 下载_poi.jar包下载 Apache POI 4.0.0 正式版 Office文档jar包 官方免费版 支持Java8+ 下载-脚本之家...
  9. 玩转华为ENSP模拟器系列 | 配置URPF示例
  10. mac调节外接显示器亮度
  11. 深信服AC1100上网行为管理
  12. 【Arch】Android 7 Nougat源码目录结构分析
  13. Java - mian()
  14. Python代码画小猪佩奇--turtle绘图
  15. SAP ABAP 自动批量开关账期程序 OB52和MMPV
  16. Strippednot stripped
  17. 知乎上的48条神回复
  18. 天堂祭祀php,test_《扶摇柳真真免费阅读》
  19. 题解报告`排列组合 (组合 + 牡牛和牝牛 + 方程的解) 7/30
  20. GNU/Linux 正则表达式与三剑侠(grep,sed,awk)(精)

热门文章

  1. vue 父子之间通信及非父子之间通信
  2. iOS学习笔记之正则表达式
  3. 如何把he_llo wo_rld 变成 HeLlo WoRld
  4. 关于审核被拒申诉那点事
  5. char和char*
  6. android网络配置
  7. 别把SEO当苦力活,做优化要讲究策略
  8. 0427千里之行,始于足下
  9. Delphi中怎么结束线程(这个线程是定时执行的)(方案一)
  10. 我的第一个字典-Dictionary