正如前面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 }

具体实现步骤连接:

android开发学习之路——连连看之游戏界面(一)

android开发学习之路——连连看之数据模型(二)

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

android开发学习之路——连连看之游戏Activity(四)

android开发学习之路——连连看之游戏逻辑(五)

转载于:https://www.cnblogs.com/weilongfu/p/7383418.html

android开发学习之路——连连看之加载图片(三)相关推荐

  1. android开发学习之路——连连看之游戏逻辑(五)

    GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖, ...

  2. android开发之用阿里云OSS加载图片

    概要 阿里云对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务.用户可以通过调用API,在任何应用.任何时间.任何地点上传和 ...

  3. android开发用百度识别图片格式,Android开发学习之路-机器学习库(图像识别)、百度翻译...

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  4. Android开发之通过接口回调机制加载数据(源代码分享)

    Android开发之通过接口回调机制加载数据的简单实现,在实际开发中通过callback方法得到网络加载的数据的使用频率远比通过直接开启线程或异步任务加载数据的频率高的多,这篇文章的代码将简单实现该机 ...

  5. 学习Mac开发第四弹 通过NSImageView加载图片

    学习Mac开发第四弹 通过NSImageView加载图片 创建NSImageView 1 . 拖拽大法好 Autolayout 创建一个宽高160 *160 的NSImageView 创建是正方形的 ...

  6. android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题

    今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...

  7. Android 开发学习记录(4)---- httpclient使用(三)

    之前在Android 开发学习记录(3)---- httpclient使用(二)中介绍了如何使用httpclient访问需要账户登录的网址,当然首先是要有一个合法的登录账户. 但是现在好多网站在登录时 ...

  8. Android:ViewPager详解(异步网络加载图片,带图片缓存,并带导航小圆点)

    android 应用中,如欢迎指引页面, 和图片轮播功能, 或者更多的内容在一页显示不了,要分成多个页面,这时候viewpager是很好用的. 首先看下效果: 下面是一个例子,带异步网络加载图片,并带 ...

  9. Android中的缓存处理及异步加载图片类的封装

    一.缓存介绍: (一).Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一. 1.没有缓存的弊端: 流量开销:对于客户端--服务器端应用,从远程获取图 ...

最新文章

  1. Python 标准库之 os (获取当前目录、读取/设置环境变量、重命名文件、运行shell命令、创建/删除/查看目录文件、判断目录/文件/存在、获取绝对路径、获取文件名、获取换行符、获取路径分隔符)
  2. 2246xt u盘开卡详细教程_U盘制作PE及系统安装详细教程!
  3. 超简单的视频对象提取程序
  4. layui父页面调用子页面的渲染_layui的iframe父子操作方法
  5. 在正式使用计算机账务系统的银行对账功能,用友ERP-U8管理系统认证考试理论题...
  6. 西门子滚筒洗衣机教程_西门子洗衣机怎么样 西门子洗衣机哪款好
  7. HDU2449 Gauss Elimination 高斯消元 高精度 (C++ AC代码)
  8. 多模态multi-modal 与多视图multi-view
  9. WinZip 6 for Mac(压缩压解工具)附注册码 v6.5.4149破解版
  10. 三星6818真八核嵌入式开发板添加宏定义方法
  11. linux环境vmd安装,Ubuntu下VMD安装
  12. 如何申请:悟空问答,达人,金V认证!
  13. Matlab小实例(一)
  14. 因执迷而绽放,终登聆听贡献者荣誉榜
  15. 均值方差模型python_python实现资产配置(2)--Blacklitterman 模型
  16. mysql的weekday函数_MySQL WEEKDAY()用法及代码示例
  17. 关于Java二进制和十六进制转化的一点问题
  18. 锡兰这里除了雪什么都有
  19. u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统
  20. Android搜索功能的案例,本地保存搜索历史记录

热门文章

  1. Mybatis返回类型和Java常见对象类型
  2. 微星冲锋坦克2 Pro GP76怎么样?测评值得买吗?详细性能点评
  3. CIF-BASED COLLABORATIVE DECODING FOR END-TO-END CONTEXTUAL SPEECH RECOGNITION
  4. C Primer Plus 第六版 编程练习第四章答案 最新出炉
  5. cordova platform add ios --save Error: Failed to fetch platform cordova-ios@5.1.1
  6. python五子棋人人对战_简单的五子棋-人人对战
  7. 牛客寒假算法基础集训营2:处女座的期末复习(贪心入门)
  8. 阿里巴巴内训讲师分享:阿里技术人的第一节课
  9. 北漂:我在燕郊买74万房子被…
  10. 运行html后电脑不能上网了,路由器安装后电脑无法上网解决办法