Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 613|回复: 0

android连连看开发技巧(5)

[复制链接]

该用户从未签到

发表于 2012-3-28 12:00:41 | 显示全部楼层 |阅读模式
android游戏开发之连连看(5)
加载界面的图片
正如前面AbstractBoard类的代码中看到的,当程序需要创建NPiece对象时,程序会直接调用ImageUtilgetPlayImages()方法去获取图片,该方法将会随机从resdrawable-mdpi目录下取得N张图片。
为了让getPlayImages()方法从resdrawable-mdpi目录下随机取得N张图片,程序的实现思路可分为如下几步:
1)通过反射来获取R.drawable的所有FieldAndroid的每张图片资源都会自动转换为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类的代码:
程序清单:codes18LinksrcorgcrazyitlinkutilImageUtil.java
public class ImageUtil

{

         // 保存所有连连看图片资源值(int类型)

private static List
imageValues = getImageValues();

        //获取连连看所有图片的ID(约定所有图片IDp_开头)

public static List
[/table][size=FONT-SIZE: larger,larger]
getImageValues()
         {
                   try
                   {
                            // 得到R.drawable所有的属性, 即获取drawable目录下的所有图片
                            Field[] drawableFields = R.drawable.class.getFields();
List
[size=FONT-SIZE: larger,larger] resourceValues = new ArrayList
[size=FONT-SIZE: larger,larger]
();
                            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
[size=FONT-SIZE: larger,larger] getRandomValues(List
[size=FONT-SIZE: larger,larger]
sourceValues,
                   int size)
         {
                  // 创建一个随机数生成器
                  Random random = new Random();
                   // 创建结果集合
List
[size=FONT-SIZE: larger,larger] result = new ArrayList
();
                   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
getPlayValues(int size)
         {
                   if (size % 2 != 0)
                   {
                            // 如果该数除2有余数,将size1
                            size += 1;
                   }
                   // 再从所有的图片值中随机获取size的一半数量
List
playImageValues = getRandomValues(imageValues, size / 2);
                   // playImageValues集合的元素增加一倍(保证所有图片都有与之配对的图片)
                  playImageValues.addAll(playImageValues);
                   // 将所有图片ID随机“洗牌”
                   Collections.shuffle(playImageValues);
                   return playImageValues;
         }
         /**
         * 将图片ID集合转换PieceImage对象集合,PieceImage封装了图片ID与图片本身
          * @param context
          * @param resourceValues
          * @return sizePieceImage对象的集合
          */
public static List
getPlayImages(Context context, int size)
         {
                   // 获取图片ID组成的集合
[size=FONT-SIZE: larger,larger]
List
[size=FONT-SIZE: larger,larger]
resourceValues = getPlayValues(size);
List
[size=FONT-SIZE: larger,larger]result = new ArrayList
[size=FONT-SIZE: larger,larger]
();
                   // 遍历每个图片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;
         }
[table=100%,#e0e0e0]}
(未完.摘自[疯狂Android讲义.李刚])
      原文出处:疯狂软件教育http://www.fkjava.org/newsView-415.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 23:47 , Processed in 0.309580 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表