主要给大家介绍如何加载界面的图片。正如前面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类的代码。
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;
}
}
转自:http://www.eoeandroid.com/thread-100856-1-1.html
发表评论
-
android aidl 主进程子进程间数据相互传递
2012-12-18 11:49 3907android中进程间的通信对与大量的接口的调用的时候,一般是 ... -
android 实现在titlebar上显示进度条
2012-11-13 18:48 828先是在setContextView之前设置界面的样式 requ ... -
android 实现下拉刷新的功能
2012-11-13 15:41 4245在android中有时我们要实现下拉刷新的功能,我在前日人的基 ... -
android aidl进程间方法的调用
2012-10-10 14:21 1602android 进程的通信很多,可以用intent传递数据,可 ... -
listView 点击一个Item效果
2012-01-13 17:20 6本人刚做一个项目需求是这样的:展示通话记录的列表,点击每一条记 ... -
android aidl
2012-01-11 11:12 1020android中的进程间的通信很多,下面粗略的讲解一下如何实现 ... -
android 权限大全
2011-12-22 20:08 849android.permission.ACCESS_CHECK ... -
android Action大全
2011-12-21 20:26 1105String ADD_SHORTCUT_ACTION 动作 ... -
android 自定义桌面
2011-12-03 16:23 13651、 把背景图片push到SDCard中 adb pu ... -
android 判断网络是否连接可用
2011-12-03 13:06 1661// 判断网络是否正常 public static boole ... -
火星通讯录
2011-11-25 20:27 1380一、用.rar打开apk文档,得到文档结构图如下所示 ... -
android 四种加载模式2
2011-11-16 11:13 961singleInstance模式解决了这个问题(绕了这么半天才 ... -
activity 的四种加载的模式1
2011-11-16 11:11 988在android应用的开发中有时会activity之间的重复的 ... -
android 面试题
2011-11-09 20:17 978android 面试题 1.android中进程和进程间的通信 ... -
android ksoap调用天气预报
2011-11-08 19:27 5098下面例子改自网上例子:http://express.ruank ... -
android NDK
2011-11-03 21:34 2015Cygwin+Android NDK的安装 时 间 版 本 ... -
android 判断sdcard是否存在,以及写入权限
2011-10-16 16:57 5733做android 开发的时候经常涉及到权限的问题,而我们像sd ... -
android bitmap
2011-10-14 11:02 816对于android终端应用软件开发的人员来说图片显示时,如果图 ... -
android popupwindow,调用本地的图库,照相
2011-10-14 10:51 5381我们写项目的时候又是要自定义弹出美观的悬浮操作窗口,这里我们可 ... -
android notification
2011-10-14 10:39 994前些天刚刚做一个项目的预演,要用到广播通知,一下是一些小的学习 ...
相关推荐
Android 加载assets文件夹的文本文件 图片
Android Studio动态加载Fragment和获取实例的方法
android 使用GIS加载shp文件例子,ArcGIS Runtime SDK for Android
Android NDK开发动态加载so,采用System.load方法实现
最进出的android网络图片加载DEMO,真机亲测可用
雨松MOMO带你做游戏 Android游戏开发之游戏主菜单与进度条加载源码 欢迎大家下载阅读。
Android端最初的SVGA Player是通过继承SurfaceView(TextureView)实现的的,但是SurfaceView在硬件加速的情况下只能独立于UI层级(在最顶或者最底),如果不开启硬件加速渲染呢?效果会变得非常感人。并且在使用...
使用Glide在Android中加载SVG
Android中实现文字、图片资源国际化案例!
content.zip//解压到tomcat/webapps/下面 修改content.xml中的图片路径的IP asynclload.zip//解压后为用eclipse编写网络异步加 载数据,异步加载图片并把图片保存到sdcard中
Android从Json文件异步加载图片
介绍两种使用 BitmapTransformation 来实现 Glide 加载圆形图片和圆角图片的方法。Glide 并不能直接支持 Round Pictures ,需要使用 BitmapTransformation 来进行处理。 二、网上的实现方式 这里介绍下网上常见的...
Android中获取资源 id 及资源 id 的动态获取 我们平时获取资源是通过 findViewById 方法进行的,比如我们常在onCreate方法中使用这样的语句: btnChecked=(ImageView)findViewById(R.id.imgCheck); findViewById是...
android AsyncTask 异步加载图片
Android 加载执行ELF可执行文件
NULL 博文链接:https://fatalove.iteye.com/blog/2081791
这是一个Android异步图片加载的例子
Android 获取音乐文件的信息 Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户。
本科毕业设计论文,android解密游戏开发,从 1 绪论 1.1 课题的背景及意义1.2 研究现状1.3 论文主要工作1.4 论文结构安排 2 Android平台研究2.1 Android特征 2.2 Android应用的构成2.2.1 活动2.2.2 意图接收器2.2.3...
Android webview 加载网页以及本地资源以及SD资源demo,以及加载缓存资源