android设计.docx
《android设计.docx》由会员分享,可在线阅读,更多相关《android设计.docx(32页珍藏版)》请在冰点文库上搜索。
android设计
基于Android系统连连看的开发与设计
一、绪论
手机是已经成为了生活中不可缺少的通讯设备,没有手机有时会让人觉得寸步难行手机将脱离传统的打电话、发短信等基本的功能,而基于智能手机强大的处理能力和可扩展能力,基于3G网络高速数据传输,越来越多的功能和业务将被开发出来并大规模的应用。
正基于此,当全世界的目光聚焦在此的时候,Google于2007年11月5日宣布推出基于Linux平台的开源手机操作系统,号称首个为移动终端打造的真正开发和完整的移动软件——Android。
Android是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟(OpenHandsetAlliance)开发。
它采用了软件层(softwarestack,又名以软件叠层)的构架,主要分为三部分。
底层以Linux内核作为基础,由C语言开发,只提供基础功能。
中间层包括函数库Library和虚拟机VirtualMachine,由C++开发。
最上层是各种应用软件,包括通话程序,短信程序等应用软件则由各公司自行开发,Java编写。
以Android不只是一个操作系统而已,它包括了:
1、经过Google剪裁和调优的LinuxKernel,对于掌上设备的硬件提供了优秀的支持。
Google在Linux方面的应用能力不容置疑,Google公司所有的几十万服务器全部是自己修改过的Linux操作系统。
2、经过Google修改的Java虚拟机Dalvik,是基于ApacheHarmony虚拟机版本进行改良而来,能够提供极高的执行性能。
有了Java虚拟机,大部分Java核心类库都已经可以直接运行。
3、大量立即可用的类库和应用软件,例如浏览器Webkit,数据库SQLite,让你可轻易开发出来媲美于桌面应用复杂度的手机软件。
4、Google已经开发好了大量现成的应用软件,同时可以直接使用Google很多在线服务。
5、Google提供了基于Eclipse的完整开发环境,模拟器,文档,帮助,示例将极大推动Android快速的推广和发展。
基于Android众多的优点,围绕Android形成了一个移动手机联盟,主要的手机厂商几乎全部在列,而此联盟在极大的推动Android平台的推广和发展,在未来的几年必将大方异彩,将极大的推动整个手机操作系统甚至是互联网乃至软件行业的发展。
二、Googleandroid移动平台的相关理论
2.1Googleandroid移动平台的概述
Android是Google于07年11月5日宣布的基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成。
Android是Google开发的基于Linux平台的开源手机操作系统。
它包括操作系统、用户界面和应用程序——移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。
谷歌与开放手机联盟合作开发了Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和T-Mobile在内的30多家技术和无线应用的领军企业组成。
通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。
2.1.1Android系统的特点:
1.开放性。
Google与开放手机联盟合作开发了Android,Google通过与运行商、设备制造商、开发商和其他有关各方面结成深层次的合作伙伴关系,希望通过建立标准化、开放式的移动电话软件平台,在移动产业形成一个开放式的生态系统。
2.应用程序无界限。
Android上的应用可以通过标准API访问核心移动设备功能。
通过互联网,应用程序可以声明它们的功能可提供其他应用程序使用。
3.应用程序是在平等的条件下创建的。
移动设备上的应用程序可以被替换或扩展,即使是拨号程序或主屏幕这样的核心组件。
4.应用程序可以轻松地嵌入网络。
应用程序可以轻松地嵌入HTML、JavaScript和样式表,还可以通过WebView显示网络内容。
5.应用程序可以并行运行。
Android是一种完整的多任务环境,应用程序可以在其中并行运行。
在后台运行时,应用程序可以生成通知以引起注意。
2.1.2.Android的功能:
1.支持虚拟键盘。
虚拟键盘的出现意味着基于Android1.5或以上版本的移动设备可以同时支持物理键盘和虚拟键盘。
2.使用Widget实现桌面的个性化。
可以用Widget修饰自己的桌面。
大多数小的web应用都是从网络上获得实时数据并展示给用户的。
Android预装了5个桌面Widget,4包括数字时钟、日历、音乐播放器、相框和搜索。
3.用在线文件夹快速游览数据。
类似于OSXLeopard的QuickLook特征,Android的在线文件夹可显示常见的数据条目,比如联系人、喜欢的应用、E-mail信息、播放列表、书签、RSS源等,并不需要运行系统程序处理特定的数据条目。
4.视频录制和分享。
Android还有录制和分享视频的功能,对回放和MPEG-4、3GP等视频格式也有了更好的支持。
可以通过E-mail、MMS或直接上传到YouTube等方式来分享视频。
在线分享图片需要的点击更少。
完成照相后,当浏览图片或选择Google
5.图片上传。
在线图片服务Picasa时,只需轻点“分享”就会拥有1Gb的免费图片存储空间。
6.更快、更兼容的游览器。
Android的基于Webkit内核的游览器带来了重要的调速装置(SpeedPumb),这得益于新的Wenkit渲染引擎和优化的Java脚本编译器(SquireFish).
7.VoiceSearch语音搜索。
带有语音识别技术的Google手机已于2008年11月面世,它支持语音搜索功能。
该功能增强了默认的搜索能力,已超过纯文本搜索。
8.立体声蓝牙和免提电话。
除了增强的免提电话体验,Android还支持立体声蓝牙(A2Dphe和AVCRP),并有自动配对功能。
9.强大的GPS技术。
Android内部提供了大量的GPS组件,我们可以很轻松地获得设备当前的位置等信息,让导航等功能更加完美。
10.Android系统硬件检测。
Android可自动检测和修复SD卡的文件系统,允许第三方应用显示Android系统的硬件特征。
为了让用户下载到与自己的设备匹配的应用,我们可以检测用户设备的硬件信息,让满足应用要求的设备安装该程序,当更多的Android设备建立在不同的硬件上时,这个功能显得很实用。
2.2Googleandroid移动平台开发过程研究
Android移动平台作为21世纪的新秀,受到了越来越多的开发者的追捧,在这股发的浪潮中,逐渐形成了具有Android一套具有Android特色的开发流程。
由于Android的优越性,其开发显得非常的有规律性可寻。
大致的开发流程如下:
(1)需求分析。
作为一个软件,它必须有其存在的意义和价值。
而这价值和意义就需要靠需求分析来确定。
(2)功能分析。
作为一个手机软件,它的使命就是给用户使用的。
如何提供用户最好的用户体验就值得每一个程序员的深思。
这也是确保一个程序成功的关键所在。
(3)界面设计。
作为一个手机软件,其只能在极有限的区域中显示自己。
如何5有限的空间里面更完美的展现出自己的独特之处就显得尤为重要了。
(4)系统开发。
作为一个软件的主体部分,系统开发的好坏直接决定了该系统的性能和寿命。
(5)测试。
在任何一个软件开发行业中,无论是J2EE、J2SE、J2ME等等其他开发中,测试时必不可少的一环。
在Android开发中,由于手机的搞频率使用,和硬件系统上的不足,使得对软件的要求更加的严格,这就要求在开发完成后,在对其进行严格的测试。
而测试又包括了像:
单元测试、系统测试等等方面的测试。
(6)发布。
在完成了一个系统的开发后,就要将其发布,经过广大用户的考验,只有经过这,才算是一个合格的产品。
在Android平台中,Google提供了一套完整的发布机制——Googlemarket。
3、系统设计
四、开发游戏界面
连连看的游戏界面十分简单,大致上可分为两个区域:
Ø游戏主界面区。
Ø控制按钮与数据显示区。
4.1开发界面布局
本程序将会使用一个RelativeLayout作为整体的界面布局元素,界面布局的上面是一个自定义组件,下面是一个水平排列的LinearLayout。
程序清单:
codes\18\Link\res\layout\main.xml
xmlversion="1.0"encoding="utf-8"?
>
xmlns:
android="
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"
android:
background="@drawable/room">
--游戏主界面的自定义组件-->
android:
id="@+id/gameView"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"/>
--水平排列的LinearLayout-->
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"
android:
orientation="horizontal"
android:
layout_marginTop="380px"
android:
background="#1e72bb"
android:
gravity="center">
--控制游戏开始的按钮-->
这个界面布局很简单,指定按钮的背景色时使用了@drawable/button_selector,这是一个在res\drawable目录下配置的StateListDrawable对象,配置文件代码如下。
程序清单:
codes\18\Link\res\drawable-mdpi\button_selector.xml
xmlversion="1.0"encoding="UTF-8"?
>
android="
--指定按钮按下时的图片-->
state_pressed="true"
android:
drawable="@drawable/start_down"
/>
--指定按钮松开时的图片-->
state_pressed="false"
android:
drawable="@drawable/start"
/>
其中GameView只是一个View的普通子类,开发了上面的界面布局文件之后,运行该程序将可以看到如图1所示的界面。
图1游戏布局
4.2开发游戏界面组件
本游戏的界面组件采用了一个自定义View:
GameView,它从View基类派生而出,这个自定义View的功能就是根据游戏状态来绘制游戏界面上的全部方块。
为了开发这个GameView,本程序还提供了一个Piece类,一个Piece对象代表游戏界面上的一个方块,它除了封装方块上的图片之外,还需要封装该方块代表二维数组中的哪个元素;也需要封装它的左上角在游戏界面中X、Y坐标。
图2示意了方块左上角的X、Y坐标的作用。
图2方块的左上角
方块左上角的X、Y坐标可决定它的绘制位置,GameView根据这两个坐标值绘制全部方块即可。
下面是该程序中Piece类的代码。
程序清单:
codes\18\Link\src\org\crazyit\link\view\Piece.java
publicclassPiece
{
//保存方块对象的所对应的图片
privatePieceImageimage;
//该方块的左上角的x坐标
privateintbeginX;
//该方块的左上角的y坐标
privateintbeginY;
//该对象在Piece[][]数组中第一维的索引值
privateintindexX;
//该对象在Piece[][]数组中第二维的索引值
privateintindexY;
//只设置该Piece对象在棋盘数组中的位置
publicPiece(intindexX,intindexY)
{
this.indexX=indexX;
this.indexY=indexY;
}
publicintgetBeginX()
{
returnbeginX;
}
publicvoidsetBeginX(intbeginX)
{
this.beginX=beginX;
}
//下面省略了各属性的setter和getter方法
...
//判断两个Piece上的图片是否相同
publicbooleanisSameImage(Pieceother)
{
if(image==null)
{
if(other.image!
=null)
returnfalse;
}
//只要Piece封装图片ID相同,即可认为两个Piece相等
returnimage.getImageId()==other.image.getImageId();
}
}
上面的Piece类中封装的PieceImage代表了该方块上的图片,但此处并未直接使用Bitmap对象来代表方块上的图片——因为我们需要使用PieceImage来封装两个信息:
ØBitmap对象。
Ø图片资源的ID。
其中Bitmap对象用于在游戏界面上绘制方块;而图片资源的ID则代表了该Piece对象的标识,当两个Piece所封装的图片资源的ID相等时,即可认为这两个Piece上的图片相同。
如以上程序中粗体字代码所示。
下面是PieceImage类的代码。
程序清单:
codes\18\Link\src\org\crazyit\link\view\PieceImage.java
publicclassPieceImage
{
privateBitmapimage;
privateintimageId;
//有参数的构造器
publicPieceImage(Bitmapimage,intimageId)
{
super();
this.image=image;
this.imageId=imageId;
}
//省略了各属性的setter和getter方法
...
}
GameView主要就是根据游戏的状态数据来绘制界面上的方块,GameView继承了View组件,重写了View组件上onDraw(Canvascanvas)方法,重写该方法主要就是绘制游戏里剩余的方块;除此之外,它还会负责绘制连接方块的连接线。
GamaView的代码如下。
程序清单:
codes\18\Link\src\org\crazyit\link\view\GameView.java
publicclassGameViewextendsView
{
//游戏逻辑的实现类
privateGameServicegameService;//①
//保存当前已经被选中的方块
privatePieceselectedPiece;
//连接信息对象
privateLinkInfolinkInfo;
privatePaintpaint;
//选中标识的图片对象
privateBitmapselectImage;
publicGameView(Contextcontext,AttributeSetattrs)
{
super(context,attrs);
this.paint=newPaint();
//设置连接线的颜色
this.paint.setColor(Color.RED);
//设置连接线的粗细
this.paint.setStrokeWidth(3);
this.selectImage=ImageUtil.getSelectImage(context);
}
publicvoidsetLinkInfo(LinkInfolinkInfo)
{
this.linkInfo=linkInfo;
}
publicvoidsetGameService(GameServicegameService)
{
this.gameService=gameService;
}
@Override
protectedvoidonDraw(Canvascanvas)
{
super.onDraw(canvas);
if(this.gameService==null)
return;
Piece[][]pieces=gameService.getPieces();//②
if(pieces!
=null)
{
//遍历pieces二维数组
for(inti=0;i{
for(intj=0;j{
//如果二维数组中该元素不为空(即有方块),将这个方块的图片画出来
if(pieces[i][j]!
=null)
{
//得到这个Piece对象
Piecepiece=pieces[i][j];
//根据方块左上角X、Y坐标绘制方块
canvas.drawBitmap(piece.getImage().getImage(),
piece.getBeginX(),piece.getBeginY(),null);
}
}
}
}
//如果当前对象中有linkInfo对象,即连接信息
if(this.linkInfo!
=null)
{
//绘制连接线
drawLine(this.linkInfo,canvas);
//处理完后清空linkInfo对象
this.linkInfo=null;
}
//画选中标识的图片
if(this.selectedPiece!
=null)
{
canvas.drawBitmap(this.selectImage,this.selectedPiece.
getBeginX(),
this.selectedPiece.getBeginY(),null);
}
}
//根据LinkInfo绘制连接线的方法
privatevoiddrawLine(LinkInfolinkInfo,Canvascanvas)
{
//获取LinkInfo中封装的所有连接点
Listpoints=linkInfo.getLinkPoints();
//依次遍历linkInfo中的每个连接点
for(inti=0;i{
//获取当前连接点与下一个连接点
PointcurrentPoint=points.get(i);
PointnextPoint=points.get(i+1);
//绘制连线
canvas.drawLine(currentPoint.x,currentPoint.y,
nextPoint.x,nextPoint.y,this.paint);
}
}
//设置当前选中方块的方法
publicvoidsetSelectedPiece(Piecepiece)
{
this.selectedPiece=piece;
}
//开始游戏方法
publicvoidstartGame()
{
this.gameService.start();
this.postInvalidate();
}
}
上面的GameView中第一段粗体字代码用于根据游戏的状态数据来绘制界面中的所有方块,第二段粗体字代码则用于根据LinkInfo来绘制两个方块之间的连接线。
上面的程序中①号代码处定义了GameService对象,②号代码则调用了GameService的getPieces()方法来获取游戏中剩余的方块,GameService是游戏的业务逻辑实现类。
后面会详细介绍该类的实现,此处暂不讲解。
4.3处理方块之间的连接线
LinkInfo是一个非常简单的工具类