疯狂连连看之加载界面的图片
疯狂连连看之加载界面的图片
正如前面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
疯狂连连看之加载界面的图片相关推荐
- 疯狂ios讲义疯狂连载之加载界面的图片
正如前面FKBaseBoard类的代码中所看到的,当程序需要创建N个FKPiece对象时,程序会直接调用getPlayImages()函数去获取图片,该函数将会随机从项目包下取得N张图片. 为了让ge ...
- android开发学习之路——连连看之加载图片(三)
正如前面AbstractBoard类的代码中看到的,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法将会随机从res\ dra ...
- android 动画间隔时间,Android使用View Animation实现动画加载界面
之前分别介绍了View Animation和Drawable Animation,学了就要用啊,今天给大家一个使用View Animation实现动画加载界面的实现. 首先先看一下实现效果. 下面是实 ...
- 【Unity使用UGUI实现王者荣耀UI界面(三)】登录界面以及加载界面优化
[Unity使用UGUI实现王者荣耀UI界面(三)]登录界面以及加载界面优化 [只是用来玩玩的,不要太当真] 效果显示: zhans 1. 加载界面进度100%跳转登录界面 这个功能好做,只需要将上次 ...
- 【用Cocos Creator给暗恋的女生写一个游戏(3)】——游戏加载界面
恰好今天Creator1.2发布,我们紧跟潮流,就用1.2开始做吧 X给游戏起了一个名字47-21,其中深意自己体会. (其实就是思琪名字的谐音,并且今年是她21岁的生日...当然你也可以理解为思琪爱 ...
- ArcMap软件卡在加载界面且闪退无法打开的多种解决办法
本文介绍ArcMap卡在加载界面,无法打开软件的多种解决方法. 最近,突然发现ArcMap软件打不开了,每次双击快捷方式后其会显示如下所示的加载界面,但是等待很久后加载界面消失,软件窗口却一直 ...
- swift 加载gif 框架图片
swift 加载gif 框架图片 SwiftGifOrigin 以下代码 轻松搞定 let imgView = UIImageView(frame: CGRect(x: 50, y: 100, wid ...
- 小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道
一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片. 问题描述 最近做项目的时候要实现一个上 ...
- 解决GitHub加载不出图片问题
解决GitHub加载不出图片问题 参考文章: (1)解决GitHub加载不出图片问题 (2)https://www.cnblogs.com/jooy/p/12090882.html 备忘一下.
- Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...
Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...
最新文章
- solidworks的小金球插件_SOLIDWORKS旋转流体仿真
- python package和目录_PyCharm中Directory与Python package的区别
- ftp可以传输什么类型文件_FTP文件传输工具-ForkLift for Mac
- 删除同目录下面txt文件(利用os,fnmacth模块)
- python基础知识-python基础知识总结
- Ubuntu操作U盘相关
- JAVA 前端上传文件,后端解析文件流并写入数据库
- java 4.0 下载_poi.jar包下载 Apache POI 4.0.0 正式版 Office文档jar包 官方免费版 支持Java8+ 下载-脚本之家...
- 玩转华为ENSP模拟器系列 | 配置URPF示例
- mac调节外接显示器亮度
- 深信服AC1100上网行为管理
- 【Arch】Android 7 Nougat源码目录结构分析
- Java - mian()
- Python代码画小猪佩奇--turtle绘图
- SAP ABAP 自动批量开关账期程序 OB52和MMPV
- Strippednot stripped
- 知乎上的48条神回复
- 天堂祭祀php,test_《扶摇柳真真免费阅读》
- 题解报告`排列组合 (组合 + 牡牛和牝牛 + 方程的解) 7/30
- GNU/Linux 正则表达式与三剑侠(grep,sed,awk)(精)