android手机游戏设计达人讲座光盘图书内容_第1页
android手机游戏设计达人讲座光盘图书内容_第2页
android手机游戏设计达人讲座光盘图书内容_第3页
android手机游戏设计达人讲座光盘图书内容_第4页
android手机游戏设计达人讲座光盘图书内容_第5页
已阅读5页,还剩249页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

无穷的Android平台

Symbian系统应用程序开发的繁琐 的高价位,Windows第一的智能操作系统。在2007-2008年度,作为世界电子行业龙头之一的摩托罗拉公司亏损,公司数次裁员,在借助Android机的研发过程中,摩托罗拉推出的里程碑系列市场大卖,神奇般地让公司起死回生。最近摩托罗拉甚至宣布不再采用微软平台,迫于Android势如破竹的市场成绩,以及对于Nokia和微软结为同盟的消极反应,一直对Android有成见的Nokia也不得不松口说可能推出Android系统的。看,现在的Android智能操作系统已经成为行业的一种流行风尚,到底Android有何,在此将为大家娓娓道来。 1-Android平台初1-Android是基于Linux内核的开源的操作系统,是由公司于2007年11月5日发布的,号称世界上第一款开源的软件平台,当前版本是随着ndroid新版本的密集推出和用户体验的提升,ndroid用两年时间就打败了ymbian系统,成为最受欢迎的智能操作系统。摩托罗拉、TC、三星、联想等公司都推出了针对Android的智能,基于Android的平板电脑虽然为数不多,但是已经推出市场。 AndroidSDK提供了一些开发接口供开发组件,需要采用java语言开发,将现的图1-1Android操作系统组成Applications层是Android本身自带的一些应用程序:邮件客户端、程ApplicationFramework层组件允许开发者并使用它们,也允许开发者发布自己的组件或者替代这些组件。Android的一些程序都是由该层的下列组件构成的:ResourceManage让程序能够各种资源文SystemClibrary被基于LinuxSGL2D3Dlibraries基于OpenGLES1.0的实现,对3D图形进行硬件加速和光栅AndroidRuntime层是Dalvik虚拟机,它提供了java语言的运行环境。Dalvik虚拟机是运行在LinuxKernel之上的。1-搭建Android开发1-J6.0(J6.的Layout界面编辑器对java版本的要求,版本低将导致异常使Eclipe退出,不能正常使用)上述软件均可以在互联网上获得,Eclipse3.4得到后解压即可使用。鉴于Android开发环境的庞大,时间较长,AndroidSDK在拷贝后也可以正常使用,所以如果在其他电脑上已经好了AndroidSDK,可以直接拷贝使用。安装ADT是Android开发环境在Eclipse中的一个插件,其安装方法和安装其他点击Eclipse帮助菜单栏下面的SoftwareUpdates按钮启动如下框,如图1-2的图1-2SoftwareUpdates使用AvailableSoftware选项卡下的AddSite按钮来(不提倡)或者本地安图1-3点击AddSite或本地安安装我们可以从ndroid获取SDK的器,将SDK到本地电脑,如果周围有人已经完毕,你可以直接拷贝使用不需重复,因为过程曲ADT安装后重启Eclipse,你可以在Window的Preferences下看到Android的节点,在左边点击Broe按钮定位到文件夹,Eclip就能够识别ndroid,如图1-4图1-4Eclipse识别到Android图1-4为AndroidSDK2.3版本的截图,下图为AndroidSDK3.0版本的截图,如图1-5AndroidSDK3.0如果你是从AT以前的版本升级过来的,也就是AT从0.9.9或更以前的版本直接更新到8.0.1,你会发现更新后,旧的K已经不能正常使用了,因为K的6的以前的 6的图1-6新旧 结构对虽然版本的AT是10.0.0,但是这个版本的layout编辑器还存在一些使用问题。10.0够让我感受下面lyou编辑的编界面如图1-7示。图1-7layout编辑器的编版本开发环境的运行速度有了些许提高,开发工具的一些界面也有所改变,通过layout的L如图1-8图1-8以前版本中间的收缩栏比较明显(左),新版本(右)没有那么明显的区分定制模拟安装完ADT和SDK之后,就可以开始定制模拟器了。在SDK中点击下图中的小机器人形状(箭头向下)的按钮,如图1-9ndroidK图1-9点击小机器人按钮在这个AndroidSDKandAVD管理器中,你会看到中间白色面板内列出了当前图1-10列出了当前的模拟器的点击New按钮之后,会打开新建模拟器窗口,在这个窗口中我们需要给出模拟器的名字和版本、SD的大小、屏幕大小、支持的硬件设备等信息,如图1-11图1-11填入新建模拟器的在arget下拉列表里选择模拟器的版本,如图1-12所示。它包含DK所有可以支持的版本,要注意的是不是版本越高越好,而是越低越好,因为版本越低,程序就可以行机器,nrid向兼容。图1-12选择模拟器版本图1-13选择屏幕表1-1屏幕类型对应的分对于硬件设备(Hardware)一栏,可以点击New按钮弹出如下框,如图图1-14选择支持的硬件设备现在设置完毕,点击CreateV按钮后模拟器就创建成功了。你可以在列表中看到刚刚定义的模拟器,如图1-15所示。如果不需要它,可以通过右边的elete按图1-15模拟器创建成功注注在编写程序的过程中,模拟器功不可没,但是要记住,模拟器不能尽信,最终的序必须要通过真机的检测1-编写第一个Android程1- 的图1-16NewProject图1-17创建一个新的Android填写完各项内容后,在BuildTarget下面,你需要选中一个目标版本(这里选择的是Android1.5),但是要确定该版本的模拟器存在,如果不存在则需要创建一个 图1-18Android1.5和Android1.6下面来详细分析第一个Android程序的工 ,各项对应的含义如表1-表1-2工 中各项目对应的含存放等资源,根据屏幕dpi的值来不同的图图1-19程序显示打开源打开源nrd6package }}/**Calledwhentheactivityisfirstcreated.publicvoidonCreate(Bundle}oAndroid6extendsActivitypublicimportimport的 <?xml<?xmlversion="1.0"encoding="utf-<LinearLayoutxmlns:Android="http://s> y上放置了一个文本TextView,它的内容是@string/o,但是我们在运行结果看到的是:oWorld,oAndroid6!,而不是@string/o。tt 发了一些配置<?xmlversion="1.0"encoding="utf-<string o 可以尝试修改一下o的值为:o,oAndroid6!,重新运行结果,发现结果改变了,@string/o代表strings.xml中名字为o的字符串的内容。你也可以尝试添加的字符串:<stringname="peiandsky">peiandskyishandsome图1-20添加或删除字符串打开main.xml,也有和strings.xml类似的操作视图,可以拖拽一些东西到屏幕上。图1-21main.xml的<?xmlversion="1.0"encoding="utf-<LinearLayoutxmlns:Android="http://s Android:orientation="vertical"Android:layout_width="fill_parent" Android:layout_height="wrap_content"Android:text="@string/o"<ButtonAndroid:text="@+id/Button01"Android:layout_width="wrap_content"Android:layout_<CheckBoxAndroid:text="@+id/CheckBox01"Android:id="@+id/Android:layout_width="wrap_content"Android:layout_<DatePickerAndroid:layout_width="wrap_content"Android:layout_nnrf<?xmlversion="1.0"encoding="utf-<applicationAndroid:icon="@drawable/icon"<activityAndroid:name=".MyFirstActivity"<intent-<actionAndroid:name="Aent.action.MAIN"<category<uses-sdkAndroid:minSdkVersion="9"在工程描述文件nrae.l中,每一个tty的子类都需要在该描述文件中进行配置,否则程序将不能找到ity,调用的时候就会报错。在vy描中了。图1-22Androidmanifest.xml图1-23添加Activity的描图1-24允许程序进行敏感

的表1-3常用的允许程序权头注注新接触Anod,多动手去修改工程中的每一段代码,看看有什么现象发生,看看会出什么错误,多尝试,那样就会学到 东西。1- 程序的修本和调1-切换程序版oAndroid程序将工程的ndroid版本定格为1.5,我们能不能在在这个基础.3打开工程的Properties(属性)框,选中Android节点,如图1-25所示。将你想要切换到的版本选中,然后点击右下角的ppl图1-25切换<uses-sdkAndroid:minSdkVersion="9"图1-26更改后的显示结果你一定还记得在初次学习java程序的时候写的oWorld程序,我们可以通过下面的语句在控制台打印出oWorld字符串:调试程Android如何输出信息呢?如何调试呢?有必要在一开始的时候就给大家稍作讲解,这样在后面学习ndroid的过程中就会少走许多弯路,自己就可以找到程序的症结所在。的图1-27LogCat图1-28查看执行Log.v("vvv","allLog.d("ddd",Log.i("iii",Log.w("www",Log.e("eee",图1-29输出有有些时候LogCat工作不稳定,你可以通过View中的device选中制定的模拟注点击一下,LogCat就出所有的输出信息1-Android程序的签名和1-该工程,选择下图中的ExportUnsignedApplicationPackage命令,如图1-30导出一个未签名的APK将APK程序通过US传到真机的SD卡上,然后进行安装。如果这样操作的话安装将不能正常进行,会提示没有安装成功。也可以使用签名文件为未签名的APK程序签名,这种操作需要在命令行中进首先该工程,选择ExportSignedApplicationPackage命令,导出一个 的图1-31直接点击Next接着点击Next按钮,弹出一个框,这个框需要找到一个签名文图1-32需要一个签名文件图1-33输入一些图1-34导出 从java开始

java的基础语法,流程控制,以及ava相关的算法和数据结构,这对后面学习Android非常有帮助。最好你也能够对java面向对象和设计模式有比较好的理解,这对学习并掌握nridjava臃肿的今天,Android无疑为java开发者提供了一条不错的出路,很多java开发者在Android方面取得不错的成绩,并成功。有两种java开发者可以最快速地切换到Android开发:一是程序开发者,另一个则是java桌面程序开发者,他们在切换到Android开发的过程中可以充分利用原来领域里面的理论知识,在ndroidj2ee开发者在转换到Android开发上似乎有些难度,因为他们可能会天天与html、cs、jsp等打交道,对于算法、界面布局、控件等接触比较少,当然这也不是 。Flex和ilverlight开发者也可以快速上手,因为Android与这两种技术可谓相似度极高。2-几道java2-这些题目你做得好与坏都只是一个评估而已,只是让你知道在编写游戏时会使用到什么,在你学习的过程中,拨开迷雾,看到目标的路,那么本章的目的就达到了。题目三:汉诺塔问题,有三根柱子、、,上有个大小不同的铁片,从小到大叠放在A柱子上,现在希望把它们挪到C柱子上,借助于B柱子,铁片只能题目五:大富游戏问,伯各20个币,从同一格出发在一条有20格子的形道,他们别摇前,摇到多少走多少,停留一个位置就占领这个位置并为该位置升级level,每次升级消耗1个金币,每次站在对方的位置都会消耗1*level个金币,伯有30%的机会不给金币,5%2-必知必会java基2-2-Android的几个2-使用java进行Android的开发,在Android的SDK中也有一些关于java的包,下面为大家罗列出来: javax javax.xml Android的可显示组件的基类(用户界面 Android的可显示窗口小控件(用户界面 容讲容讲解注本书内容将不会涉及到java基础部分的内容,主要从android.view为主 从一个简单范例开始 编

Android程序作为一个新鲜事物第一次展现在学习者面前,相信大家首先需要的是一个直观的印象。本章为大家准备了一个精心设计的Android小程序,该程序尽可能覆盖了大部分ndroid的nrid图3-1程序运行中的画面示例展现的是在Android屏幕上有一个方块,用户点击屏幕中的任何域,方块都会经过一段时间移动到用户点击的位置,然后会弹出一个框,点击框之就会到才的面。3-3-图3-2项目AA <?xmlversion="1.0"encoding="utf-<applicationAndroid:icon="@drawable/icon"<activity<intent-<actionAndroid:name="Aent.action.MAIN"<categoryAndroid:name="Aent.category.LAUNCHER"<activityAndroid:name=".ResultActivity" <uses-sdkAndroid:minSdkVersion="4"从一个简单范例开始AndroidApplication配置了整个程序的信息,label是程序的名字,icon是程序Demoie继承自iew,做为屏幕的一个画板,我们在上面绘制了一个白色的底色,然后在坐标(50,50)的位置填充绘制了一个矩形方块,在该类中展示了屏幕触摸的,屏幕触摸的响应,游戏程的一种实现方式,从一个activitInencivty中;ResultActivity也是继承自一个activity,但是它并不是程序,你可以通过针对图3-2中展示的程序中的主要结构,下面将各个类的代码逐一展示给nnr口packageimportAndroid.app.Activity;importAndroid.os.Bundle;importAndroid.view.Window;importpublicclassDemoextends{DemoViewpublicvoidonCreate(Bundle{view=new}} packageimportAndroid.app.Activity;importAndroid.app.Dialog;importAndroid.app.AlertDialog.Builder;importAndroid.content.DialogInterface;importAndroid.content.Intent;importAndroid.content.DialogInterface.OnClickListener;importAndroid.os.Bundle;publicclassResultActivityextends{publicfinalintALERT=protectedvoidonCreate(Bundle{ }//重写Activity的方法,创建一 protectedDialogonCreateDialog(int{if(id==ALERT)//构建一个弹 Builderalert=new alert.setIcon(R.drawable.icon).setTitle("ResultActivity中newOnClickListener(){publicvoidonClick(DialogInterfacearg0,intarg1){Intentintent=newIntent();Bundlebundle=newBundle();bundle.putString("age","12");}return}return}}epackageimportAndroid.content.Context;importAndroid.content.Intent;importAndroid.graphics.Canvas;importAndroid.graphics.Color;importAndroid.graphics.Paint;importAndroid.graphics.Rect;importAndroid.os.Handler;importAndroid.view.View;importpublicclassDemoViewextendsViewimplementsOnTouchListener始位privateintsx,的标privateboolean的坐privateintex,Handler实privateHandlerpublicDemoView(Context{置、方块移动标志和Handler实sx=sy=50;moving=false;handler=new的触}View绘制方法的重protectedvoidonDraw(Canvas{用逻//创建一个Paint对象,用来绘制信Paintpaint=newRectscreennewRect(0,0320480);canvas.drawRect(screen,paint);小方Rectsq=newRect(sx,sy,sx+20,sy+canvas.drawRect(sq,paint);}从一个简单范例开始Android编的移privatevoidlogic()if(sx<ex)}if(sx>ex)sx--}if(sy<ey)}if(sy>ey)sy--}if(sx==ex&&sy==ey)目的地时,将界面切换给ResultActivity界moving=false;Intentintent=newIntent();}}摸方publicbooleanonTouch(Viewview,MotionEvent{if(!moving)ex=(int)ey=(int)me.getY();moving=!moving;调用线handler.postAtTime(moveThread,1);System.out.println("pos:"+ex+","+ey+","+sx+","+}

}returnhandler搭配实现线privateRunnablemoveThread=new{publicvoidrun()}}如如果你喜欢新的版本,那么你可以自己更改AndroidManifest.xml的配程序的版本只要大于1.6都不会出市面上的Android的机器以1.6以上的版本为主,所以只要你编写的程序保1.6或者更低的1.5版本就能够在市面上的大部分 注意在你创建这个程序的时候请选择版本在1.6以上,屏幕分辨率大小为320*480 及其生命周期

口,对于一个程序来说,只有一个。Activity类对于Android编程来说非常重要,因为所有的Android程序都需要至少有一个类继承自Activity或Activity的子类。可以重写或直接调用ctivity中的方法来实现框、菜单、显示画面更换、数据操作、触摸屏和按键的等等非常丰富的操作。图4-1android.app4- Activity的创 publicclassMyFirstActivityextendsActivitypublicvoidonCreate(Bundle{}}就已经创建了一个ctivity,该ctivity的作用是在程序被运行时将main.xml中配置的内容显示在屏幕。4-Activity的配4-不会不会给予提示,只会在运行中报错注程序中Activity的子类必须在XML中配置,否则是不能够使用的,这个在程序<activity<intent-<actionandroid:name="ent.action.MAIN"<activityandroid:name=".ResultActivity"<intent-<intent-<actionandroid:name="ent.action.MAIN"上述这个就代表Demo是第一个被指定的“行动”,就是程序的ActivityActivity注在程序中只能有一个Activity可以使用上 ,每一个程序都只能有一4-Activity的生命周4-首先被生学所使,后引入到面,某个对象新建、用及销毁的过程。ity的生命周期就是cty的创建、开始、停止、重新开始、暂-图4-2Activity的生命周期示意图 it it生命周 packageimportandroid.app.Activity;importandroid.os.Bundle;publicclassLifeCircleDemoextendsActivitypublicvoidonCreate(Bundle}protectedvoid}protectedvoid}protectedvoidonRestart()}protectedvoidonResume()} protectedvoid{);}protectedvoidonStop()}}图4-3LogCat中的程序在启动前遵循它的生命周期示意图的过程,先执行onStart方法,在获取显示前执行了onResume方法。关闭程序后就会继续打印出下面的结果,如图4-4所示:图4-4关闭程序后打印出的结果程序关闭的过程中也遵循了示意图的流程,先暂停程序,然后停止,最后销毁。如果在运行过程中有其他程序获得焦点并覆盖了屏幕,打印结果就会如图4-5所示:图4-5打印当Activity不再被显示时调用了onStop方法。等其他程序运行完毕后,重新获得屏幕显示,如图4-6所示:图4-6重新获得屏幕显示4-Activity的切4-Intentintent=newIntent();startActivity(new指指令注后面将会对Intent进行详细讲述,在此不多费笔墨,可以理解为是一种动作除了startActivity这个方法外,Activity还有另一个方法也可以达到切换的目的,和该方法搭配的还有一个回调方法,来通知执行切换操作的ctivity操作的结果。这两个方法是:startActivityForResult(Intent,int)和onActivityResult(int,Intent这都是ctivty类自有的方法,其中tartcivityorReult会切换到一个ctiitycivtyeul packageimportandroid.app.Activity;importandroid.content.Intent;import.Uri;importandroid.os.Bundle;publicclassDemoextendsActivityDemoViewview;publicfinalintpublicvoidonCreate(Bundle{New }protectedvoidonActivityResult(intreqode,intresultCode,Intentdata){if(reqode==REQUEST_TYPE1){switch(resultCode){caseActivity.RESULT_CANCELED:caseActivity.RESULT_FIRST_USER:case}}}}图4-7执行模拟器执行过程中启动了一个浏览器程序来浏览这个,所以Activity就返4-Activity数据与获4-在Activity1的生命周期中,当Activity2获取了显示,则Activity1将会调用onPause()方法,该ctivity1可以在onause方法中保存必须的数据,等ctivity1重新获取显示或者下次运行的时候能够继续上次操作。在Activity退出的时候会调用onetroy()方法,也建议在重写该方法必要的数据。packagepackageimportimportandroid.content.SharedPreferences;importandroid.os.Bundle;publicclassSaveActivityextendsActivityprotectedvoidonCreate(Bundle{System.out.println(preference.getInt("level",1));}protectedvoid{ editor.putInt("level",12);}protectedvoid{editor.putInt("level",19);}}SharedPreferences是提供存取数据方法的类,后面将会详述preference.getInt("level",图4-8执行在Activity的生命周期中可以编写游戏的自动存盘等操作,当游戏被外部4-Activity中的菜4- 表4-1Options可以提供重写的四个方选中代代publicboolean )//给菜单添加3个菜单项:save、stop、returntrue;}publicboolean Itemreturntrue;}publicvoid {}publicboolean Opened(int returntrue;} 图4-9执行图4-10执行4-设置Activity全4-设置全屏有两种方式,一种是通过代码方式,该段代码包含在Activitythis.getWindow().setFlags(WindowManager.LayoutParams.FLAG_注注上述代码中,requestWindowFeature(Window.FEATURE_NO_TITLE);是用来设置窗体无标题的;第二句代码是设置全屏<activity<activity<intent-<actionandroid:name="ent.action.MAIN"其中android:theme=@android:tyle/Theme.oitleBa.ullcreen">就是设置全屏的至关重要的配置。Activity其他方法和相关Activity的其他 其中onLowemory方在系统内存达到一个峰值的时候被调用并试图降低表4-2Activity中其他方法使用说明findViewById(int在onCreate(BundlesetContentView(intsetTitle(int获取当前Activity的Window窗体,可以调用Windows的API,如果ActivityationnewConfig)当系统参数环境发生变化时自动调用该方requestWindowFeature(int设置Window的窗体扩展特性,比如说设置为无标题窗体Activity中的Activity有直接子类:AccountAuthenticatorActivity、ActivityGroup、 Litctivity是一个通过绑定数据的方式展示列表的ctivity,并且可以响应用户。图4-11ListActivity的显代package代packageimportandroid.os.Bundle;import *@authorpublicclassListActivityDemoextends{publicvoidonCreate(BundlesavedInstanceState)ListActivity的方法来设置ListActivity的显setListAdapter(newArrayAdapter<String>(this,}数据数privateString[]mStrings={"jim","bill","alen","joe","john","leilei"};}nn n 容下<?xmlversion="1.0"encoding="utf-<uses-sdkandroid:minSdkVersion="9"<applicationandroid:icon="@drawable/icon"<activityandroid:name=".ListActivityDemo"<intent-<actionandroid:name="ent.action.MAIN"<categoryandroid:name="ent.category.LAUNCHER"指

在Android中Intent其实是一种操作的描述(也可以理解为指令),它的用途很广泛,可以被ctivity中的tartctivity方法调用切换到另外的ctivity;广播Intent可以被发送到对此感的BroadcatReceiver组件;也可以和rie成:Action和Data。Action的一般操作有:ACTION_VIEW、ACTION_Data是一个Uri对象,里面描述了例如 两个主要的属性之外,Intent还有一些辅助的属性:category、type、componentextras(需要传递的数据)。5- 关于Intent的常用常<intent-<intent-<actionandroid:value="ent.action.MAIN"<categoryandroid:value="ent.category.LAUNCHER"先是一些先是一些标准的关于 it的动常ACTION_VIEW——给用户展示数据,输入URI的数据,如果输入的是号码,则会启动中的拨号器。该常量的值是“ent.action.IEW” 指指令rr见见5-Intent指令使用示5-为了更好地说明Intent指令的使用,现给出下面示例,工程名称为示例使用Intent来做以下4个事情:①切换到另外一个ctivity界面;②启动浏览器制定;③拨打 ;④息。图5-1程序图5-2切换到AnotherActivity界图5-3切换到浏览器界面 图5-4启动拨号程序指令图5-5开启另外一个模拟器模拟通图5-6调用程图5-7另外一个模拟器提示收到图5-8程序<?xmlversion="1.0"<?xmlversion="1.0"encoding="utf-<manifestpackage="com.peiandsky"android:versionCode="1<applicationandroid:icon="@drawable/icon"android:label="@string/<activityandroid:name=".IntentDemo"<intent-<actionMAIN"<categoryandroid:name="ent.category.LAUNCHER"<activityandroid:name=".AnotherActivity" <uses-sdkandroid:minSdkVersion="9"AndroidManifest.xml中将程序中的两个Activity配置出来,面Activity中的nn<?xmlversion="1.0"encoding="utf-<LinearLayoutxmlns:android="http://s <TextViewandroid:text="另外一个Activity!"android:id="@+id/android:layout_width="wrap_content"android:layout_AnAn 中的码如下packageimportandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.KeyEvent;publicclassAnotherActivityextends{protectedvoidonCreate(Bundle{}publicbooleanonKeyDown(intkeyCode,KeyEventevent)if(keyCode==KeyEvent.KEYCODE_BACK)Intentintent=new//设置Intent的目的intent.setClass(this,//设置要传递的额外数据intent.putExtra("content","fromanothe}

return}}要界面要界面布 <?xmlversion="1.0"encoding="utf-<LinearLayoutandroid:orientation="vertical"android:layout_height="fill_parent"android:layout_width="wrap_content"android:layout_<Buttonandroid:text="启动浏览器"android:id="@+id/http"android:layout_width="wrap_content"androidlayout_<Buttonandroid:text="拨打 "android:id="@+id/call"android:layout_width="wrap_content"android:layout_android:layout_width="wrap_content"android:layout_width="wrap_content"android:layout_"<ButtonIntntemo这个ctvity是整个示例的ctiviy,它将布局文件设置为当前显示的ie,并取4个钮,它们置。码package码packageimportandroid.app.Activity;importandroid.content.Intent;import.Uri;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button; publicclassIntentDemoextendsActivityimplementsOnClickListenerButtonactivity,call,http,message;publicvoidonCreate(Bundle{activity=(Button)findViewById(R.id.activity);call=(Button)findViewById(R.id.call);http=(Button)findViewById(R.id.http);message=(Button)findViewById(R.id.message); }publicvoidonClick(Viewv)Intentintent=newswitch{case

case caseUrisms=intent=new}}}注注本示例采用的Android模拟器屏幕为320*480,Android版本为2.3用户界面

件、创建菜单框按钮、控制布局等。在下面我们用示例详细地来看packageimportandroid.app.Activity;importandroid.os.Bundle;publicclassMainActivityextends{publicvoidonCreate(Bundle{ }}在res文件下有一个文件夹layout,里面有一个mian.xml,R.layoutmain,其实就<?xml<?xmlversion="1.0"encoding="utf-<LinearLayoutxmlns:android="http://s> 通过查看API文档,会发现无论LinearLayout类,还是extiew类都是iew的 oworld字符串显示在屏幕上,这 oworld的Android版本。图6-1oworld的Android版6-使用View的layout子类6-ie的子类非常繁多,根据功能不同可以分为两类,一类是用来对用户界面进行布局的,另一类是展现给用户,并响应用户的操作。用户界用户界Absoluayout、FrameLayout、LinearLayout、RelativeLayout、表6-1各layout子类对应的布局类型 使用LinearLayout布LinearLayout如如果不设置layout_width和layout_height这两个属性,View控件将不会被看到,默认值为0。注<TextViewandroid:id="@+id/text1"<TextViewandroid:id="@+id/text1"注注ID表示该控件View的唯一标示,text表示View控件的显示文本内容图6-2设置后的显示效果图6-3设置宽度后的显示效果图6-4vertical的显 用 用户界图6-5horizontal的显示效LinearLayout可设置的属性参数不多,它有一些和其他layout同样的属性,下图列出了最全的概括,如图6-6所示。对于常用的属性我们进行了总结,如表6-2ayot表6-2LinearLayout常用属性设和上面有所不同,上面的gravity是设置当前的View的子View的重力方向(不包括当前View),而layout_gravity则是设置当前View在它的父View中的重力方向,会覆盖掉View中指定的重力方向,对当前View的子ViewView的唯一标示,可以通过findViewById方法得到该View的对象android:paddingandroid:android:paddingRight设置View的内间距,padding为四个边界都设置一定的像素,下面的四个是单独设置各个方向的内间距,是ddngandroid:layout_margin android:layout_图6-6LinearLayout可设置的属性参数使用FrameLayout布下面我们试着在layout文件夹中创建一个frame.xml文件,里面放置了3<?xmlversion="1.0"encoding="utf-<FrameLayoutxmlns:android="http://s <ImageViewandroid:src="@drawable/fk2"android:layout_width="wrap_android:layout_height="wrap_content"<ImageViewandroid:src="@drawable/fk3"android:layout_width="wrap_android:layout_height="wrap_content"<ImageViewandroid:src="@drawable/fk4"android:layout_width="wrap_android:layout_height="wrap_content"图6-7显示注注ImageView是显示一 的View控件,TextView是显示一段文字的View控。android:src="@drawable/fk4"表 控件要显示 在资源文件夹中的位 名需要采用小写的字母和数字的组合,且以字母开头表6-3Framelayout设置前景显示的方式,默认情况下为fill,就是填充使用TableLayoutTableLayout表格布局有两个控制:TableLayout和嵌套在它内部布局嵌套来实现,过度的表格嵌套会使abeayut的使用效率下降。注对于表格大家都最熟悉不过了,一个表格分为行和列,在表格布局中,只有<?xml<?xmlversion="1.0"encoding="utf-<TableLayoutxmlns:android="http://s ><Buttonandroid:text="1"<Buttonandroid:text="2"<Buttonandroid:text="3"<Buttonandroid:text="4"<Buttonandroid:text="5"<Buttonandroid:text="6"<Buttonandroid:text="7"<Buttonandroid:text="8"<Buttonandroid:text="9" 图6-8显示码<?xml码<?xmlversion="1.0"encoding="utf-<TableLayoutxmlns:android="http://s android:shrinkColumns="0"<EditTextandroid:lines="2"android:layout_width="fill_parent"android:layout_height="wrap_content"/><Buttonandroid:text="1"<Buttonandroid:text="2"<Buttonandroid:text="3"<EditTextandroid:lines="2"android:layout_width="fill_parent"android:layout_height="wrap_content"/><Buttonandroid:text="4"<Buttonandroid:text="5"<Buttonandroid:text="6"<Buttonandroid:text="7"<Buttonandroid:text="8"<Buttonandroid:text="9"注注EditText是一个输入图6-9显示图6-10分拆后的显示效果<Buttonandroid:text="7"<Buttonandroid:text="8"<TableLayout<Buttonandroid:text="9"<Buttonandroid:text="0"表6-4TableLayout设置表格布局要折叠隐藏的列,多个列用逗号隔开,例如:andoid:collapeolumns0,1"设置行自由拉伸,如果多行需要自由拉伸,中间用逗号隔开,例如:andoid:tretchColumns"0,1,2"设置列收缩,多列收缩中间用逗号隔开,例如设置10,adod:hikoun1"adod:tthlun0",使用RelativeLayoutRelativeLayout从字面上可以理解为相对布局,给出一个参照物,可以相对这个参照物来设置其他物品的摆放位置,所以参照物必须要先设置具置。码码<?xmlversion="1.0"encoding="utf- android:text="Typehere:"/>android:layout_below="@id/label"/>android:text="OK"/>android:text="Cancel" 图6-11显示设置输入框O的对齐方式为右对齐,设置左边的外边距为10dip,和CacelRelativeLayout6-5表6-5RelativeLayout设置该View的baseline和给定的参照物的关于Absolu因为绝对位置的布局比较死板,在不同屏幕上的展示方式不灵活,不建议使用,在此也不多作讲解。6-6-在上面讲到的5种layout布局过程中,使用了几个控件,例如TextView、文字和图像控 图6-12XML<?xml<?xmlversion="1.0"encoding="utf-<LinearLayoutandroid:orientation="vertical"android:layout_height="fill_parent"android:gravity="left">视图中只显示了textiew的默认文字@+id/extie01,可以修改成任意我们想显示的文字,通过设置android:text的属性值,android:id是所有的iew都有的属性,它的值有一个格式“@+id/”,后面加上的内容才是它的I。运行程序后,你会发现只有TextView的显示而找不到ImageView图6-13运行表6-6TextView和EditText的属性设按钮和按钮处 用户界表6-7Android中常用按钮列表单项选择按钮,多个adioutton如果需要互斥,就必须包含在同一个adioGoup中<?xml<?xmlversion="1.0"encoding="utf-<LinearLayoutandroid:orientation="vertical"android:layout_height="fill_parent"android:gravity="left"OnClickListener是对按钮处理的接口,可以通过button 用 用户界代代privateOnClickListenermCorkyListener=new{publicvoidonClick(Viewv)}protectedvoidonCreate(BundlesavedValues)Buttonbutton=//给该 }一个程序的实下面用学过的关于View的控件做一个小程序,实现输入检测、重置等功图6-14程序效果代<?xml代<?xmlversion="1.0"encoding="utf-<LinearLayoutxmlns:android="http://s android:orientation="vertical"android:layout_width="fill_parent">>>用户界> >>>>>>> packagepackageimportandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.Window;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.CheckBox;importandroid.widget.EditText;importandroid.widget.RadioButton;importandroid.widget.Toast;publicclass ctivityextendsActivityimplementsOnClickListener EditTextname,RadioButtonmale,CheckBoxagree;Buttonok,reset;publicvoidonCreate(BundlesavedInstanceState)name=(EditText)findViewById(R.);password=(EditText)findViewById(R.id.password);male=(RadioButton)findViewById(R.id.male);female=(RadioButton)findViewById(R.id.female);agree=(CheckBox)findViewById(R.id.CheckBox01);ok=(Button)findViewById(R.id.ok);reset=(Button)}publicvoidonClick(View{{caseStringBuffersb=newStringBuffer();Toastt=Toast.makeText(this,sb.toString(),case}}}Toast这段代码的意思是设置ok和reset的器,这样ok和reset的将可以被处理,在处理中通过ID进行分别处理。上述代码中使用oast,就是一个信息提示框,当点击ok按钮的时候,会把获取到的所有信息弹出展示出来,点击reet按钮时,会重新设置输入框和选择按钮的状态,达到重置的目的。注注android.view.View.OnClickListener才是需要的 器,Android中还有一个和它 其他常用的View子表6-8其他常用的Vew子类列表

ArrayAdapter<String>=newArrayAdapter<String>(this,android.R.layout.simple_ Spinnersp=(Spinner)findViewById(R.id.Spinner01); 6-6-代package代packageimportandroid.app.Activity;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.view.ViewGroup.LayoutParams;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassMainActivityextends{publicvoidonCreate(Bundle{LayoutParamsparams=LinearLayoutlayout=newTextViewtv=newTextView(this);tv.setText("otextview");Buttonok=newButton(this);}}从上面的代码可以看出来,纯代码方式在开发效率上不如代码和XML结合的方式高,而且纯代码方式不能直观地展现布局效果,在布局和控件使用方面,纯编码方式需要自定义一些对象,不如XML方式直接配置快捷,所以慎用纯代码的方式。6-View的自定义绘6-问题处理程序

Handler是Android中的问题处理程序,它处理接收到的信息和执行传递的Runnable对象。当你在创建一个andler对象时,系统会随之创建一个和该对象绑定在一起的一个线程与信息的队列,Handler会将信息和Runnable对象传递给该队列并在它们出队列的时候执行它们。可以将ade7- 使用Handler发送和处理消图7-1Handler下述几个方法可以向Handler传递一个Message,会调用Handler如果想传送有内容的Message,就可能需要使用setData(Bundledata)方法,来说到这里也有必要说一下Bundle,它其实就是一个Map,包含了一些键值对。<?xmlversion="1.0"encoding="utf-<LinearLayoutandroid:orientation="vertical"<Buttonandroid:text="SendEmptyMessage"android:id="@+id/send"android:layout_width="wrap_content"android:layout_<Buttonandroid:text="SendMessage"android:id="@+id/send2"android:layout_width="wrap_content"android:layout_下面这段代码定义了一个名字为HandlerDemo的Activity,在其中创建了一个Handler的实例,并重写它的publicvoidhandleMessage(Messagemsg)方法来接收处 代问题代问题处理程序packagecom.peiandsky;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importpublicclassHandlerDemoextendsActivityHandlerhandler=newHandler(){publicvoidhandleMessage(Message{switch(msg.what){caseToastt1=caseBundleb=Toastt2=Toast.makeText(HandlerDemo.this,+b.get("name")+","+b.get(" }}publicvoidonCreate(Bundle{Buttonsend=(Button)findViewById(R.id.send);Buttonsend2=(Button)findViewById(R.id.send2);}OnClickListenerlistener=new{publicvoidonClick(View{switch{casecaseR.id.send2:Messagemsg=newMessage();msg.what=Bundleb=newBundle();b.putString("name","peiandsky");if{System.out.println("send}elseSystem.out.println("send}}}}首先通过findViewById找到两个Button对象,并为他们设定。在器OnClickListener的实例listener中根据不同按钮的按下发送不同的Message。publicvoidhandleMessage(Messagemsg)方法中处理这个Message的时候就可以通过 问问题处理程序 sendMessageDelayed(Messagelong)则表示接收到Message后再过long毫秒后再7-用Handler处理Runnable对7-下述代码涵盖了对于Handler传递Runnable对象的使用,只需要稍微一改动,就可以将andler当做线程来使用。在游戏中的体现比如说不停刷新屏幕,游戏元packagecom.peiandsky;importpackagecom.peiandsky;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;publicclassHandlerDemo2extendsActivityHandlerhandler=newRunnablerunnable1=newRunnable(){publicvoidrun()System.out.println("post:"+}Runnablerunnable2=new{publicvoidrun()}Runnablerunnable3=newRunnable(){publicvoidrun()}protectedvoidonCreate(Bundle{handler.postDelayed(runnable2,1000);handler.postAtTime(runnable3,}}HandlerHandlerhandler=newRunnablerunnable1=new{publicvoidrun()handler.postDelayed(runnable1,100);System.out.println("gamethread");}做出改动后,你会发现gamethread在每隔100毫秒后就会自动打印一次,重复基本图像绘

平时上美术课,在绘图的过程中会使用到如下工具:画板、画笔、(。在Android中的绘图和现实中的绘图大同小异,iew以及其子类充当了画板的角色,Canva充当了画笔的角色,Coloran8- 前面的章节已经对iew控件做了一个初步的介绍,本章绘制基本图形是实现了iew的onraw方法,将ie的区域当做是一个画板,可以自ie示程大框packageimportandroid.app.Activity;importandroid.graphics.Canvas;importandroid.os.Bundle;importandroid.view.View;publicclassMainActivityextends{publicvoidonCreate(Bundle{}}classGameViewextendsView{publicGameView(Context{}protectedvoidonDraw(Canvas{}}法,然后在ctivity中创建了一个ie的实例并调用ctivity的方法etContentiew戏戏编程中,游戏画面动态元素比较多时会使用第二种方式。式更适合于牌类游戏,第二种方式比较适合RPG游戏、动作类游戏等注式是继承自View的子类SurfaceView,在式继承自View8- 绘图技巧类Paintiew的onDraw方法已经涉及到了画笔类Canva,提供了Canvas的一个实例供我们调用它的绘制方法。Paint类中包含了绘制位图、文本、几何图形的一些颜色和样式,在绘制过程中起到很重要的作用。在ndroid说明文档中首先列出的是aint8-1表8-1Paint类内嵌的类及其作用绘制文本的对齐方式,有3种类型:CENTER、LEFT、RGHT,三种类型的对其效果依次显示在下图canvas.drawText("abcdefg",50,50,paint);canvas.drawText("abcdefg",50,80,paint);canvas.drawText("abcdefg50110paint);描述在line和path的开始和结束为止的线条头是什么样的,有下列几种类型:ROUND、BUTT、SQUARE,三种类型修饰的粗细为10的线条依次显示在下面的图像上在绘制path时直线和曲线的连接处理,分为:BEVEL、MITER、ROUND三种类型,效果依次

Paintpaint=newPaint();Pathpath=newPath();path.addRect(newectF(20,20,60,60),Direction. th(path,paint);path.addRect(newRectF(90,20,130,60),Direction. th(path,paint);path.addRect(newRectF(150,20,190,60),Direction. th(path,

Paint.

绘制的时候会比较常用到Paint 了了表8-2Paint方法与作用PaintgetTextBounds(char[]text,intindex,intcount,RectmeasureText(char[]text,intindex,int获取字符串text中从index开始count个字符每一个的宽度存放在widths数组中,该方法也有几个重载的方法供选择使用:getTextWidths(char[]text,intindex,intcount,float[]表8-3text特殊效果设置 上述表中的设置方法全部都可以通过setFlags(intflags)一个方法来完成,它们ANTI_ALIAS_FLAG,DEV_KERN_TEXT_FLAG,FAKE_BOLD_TEXT_FLAG,LINEAR_TEXT_FLAG,STRIKE_THRU_TEXT_FLAG,SUBPIXEL_TEXT_FLAG,UNDERLINE_TEXT_FLAGpublicpublicvoiddrawMyText(Stringtext,inttextSize,intintscreenHeight,Canvascanvas)Paintpaint=newRectbounds=newRect();paint.getTextBounds("我0,1intfontW=bounds.right-intfontH=bounds.bottom-int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论