《Android群英传》读书笔记13.Android实例提高

1. 移动迷宫——拼图游戏

在开始之前,可以先创建一些常用的共通方法、共通资源,这些方法或者资源并不用每次都创建,可以建一个代码仓库进行积累。

1.1. 准备工作

1. 获取屏幕相关属性

(→ScreenUtil.java)
这些方法基本在每个App中都会用到,所以非常适合作为工具类来使用。

2. 美化按钮

通过定义shapeselector来对原生的按钮进行美化是一个非常重要的技巧。shape可以非常方便地实现流行的扁平化UI和圆角等效果
(→white_button.xml)
作为Button的属性使用:android:background="@drawable/white_button"

1.2. 初始界面

初始界面非常简单,对于标题可以使用TextView,选择难度的提示可以使用PopupWindow,展示图片的区域可以使用一个GridView显示
(→xpuzzle_main.xml)
实现点击选择难度的提示Popup:
(→MainActivity.java→void popupShow(View view))
创建用于展示图片的GridView,与ListView非常类似,第一步,先创建一个数据适配器,在getView()方法中动态生成一些ImageView用于展示要选择的图片:
(→GridPicListAdapter.java→View getView(int position, View convertView, ViewGroup arg2))
在主界面程序MainActivity中添加并展示这些图片,这里定义一些固定的图片用于选择拼图的备选图,再添加一个按钮用于自定义图片,比如从相册选择或者通过拍照来设置拼图图片。
首先将所有要显示的图片保存到要传入数据适配器的List中,再通过数据适配器来将这些图片展示出来。(→见MainActivity.java)

1. 点击事件

点击默认的图片后,进入拼图界面,而点击最后一个ic_launcher的图片后,能够弹出对话框让用户选择本地图库或者进行拍照来设置图片。使用本地图库,需要借助系统Intent Action来实现,选择相机拍照同样也是使用Intent Action。由于要对ExternalStorage进行读写,所以必须在AndroidManifest文件中申明所需要用到的权限。(→见MainActivity.java)
在调用系统本地图库或者相机拍照后,在程序主界面的onActivityResult()回调方法中来获取选择的图片、拍照的图片:
(→MainActivity.java→void onActivityResult(int requestCode, int resultCode, Intent data))
对选择图库图片的获取,需要通过ContentResolver来进行查询。
在处理完了比较复杂的本地图库和相机拍照两种方式之后,剩下的选择默认图片的点击事件就非常简单了。(→见MainActivity.java)

1.3. 拼图界面

拼图界面是游戏的主界面,我们将用户选择的图片根据选择的难度进行分割,并抽出一张图片用空白块代替,同时随机打乱顺序,作为拼图的初始游戏界面。当用户点击空白块周围上下左右相邻的图片时,可以移动该图片,当整个图片的位置都与原始图片一致时,拼图完成。
在拼图界面中,将功能划分为以下几个部分:计时、记步提示,显示原图、重新开始游戏、返回按钮和拼图主界面。这个布局与程序主界面的布局类似,上面的计时、记步,可以使用TextView,并通过Handler来进行刷新显示。中间同样可以使用GridView来展示待拼图的界面,并完成点击的逻辑。而下面的三个按钮,更加简单了:
(→xpuzzle_puzzle_detail_main.xml)

1. 拼图算法

N Puzzle问题:随机交换图片的位置之后,生成的拼图游戏高达50%都是无解的。
判断生成的拼图是否有解:倒置和算法,即根据“倒置变量值”的和的奇偶性来判断

2. 图片Item实体类

将每个分割后的图片抽象为一个实体类,以面向对象的方式来操纵每个小的拼图Item
(→ItemBean.java)

3. 图片工具

在获取到图片后,需要对这个图片进行一下处理,将图片调整到合适的大小并进行分割。
(→ImagesUtil.java)
通过这两步处理,就把图片分割成了N×N个小的Item,并将最后一个图片剔除,用于显示要移动的空格图片

4. 生成游戏

通过一个循环来随机交换Item中的图片,并判断当前生成的游戏是否有解
(→见GameUtil.java)

5. 移动图片

生成好游戏后,就可以给GridView的每个Item来响应点击事件了。当点击的图片是空格图片上下左右的图片时,就可以交换两个Item,实现移动效果。如果判断可以移动,则使用swapItems()方法进行交换。每次交换后,还需要判断是否已经还原成功。如果还原成功,将最后缺失的那一块图片补齐,并提示“拼图成功!”
到此为止(待续……)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值