其实说实话,还是不怎么爱写博客,索性不勉强自己,但今天想写点东西,关于安卓的Activity。自己写了一个安卓的简单游戏,虽然简单,但里面牵扯到了颇多类容,算是入了个门。我写的这个游戏主要实现有安卓组件运用,界面风格设定,界面布局,界面跳转,界面销毁,界面返回键菜单键的屏蔽,自定义SurfaceView组件画图,线程的使用,事件监听,获取权限,数据保存等等等等。里面几乎所有的类容都与Activity有关。
1.自定义界面风格
在资源文件夹的value目录下的style.xml里面可以自己设定风格,最好的方式是先继承一种系统提供的风格,再根据自己的需要改 ,下面的MyTheme是我自定义的风格
<style name="MyTheme" parent="AppBaseTheme" > <item name="android:windowFullscreen">true</item> <item name="android:windowNoTitle">true</item> <!-- All customizations that are NOT specific to a particular API-level can go here. --> </style>
同时还需要在安卓的主配置文件里面,把自己需要改变风格的界面里设置为自己定义的风格
<activity android:name="com.example.foolgame.GameActivity" android:label="@string/title_activity_game" android:theme="@style/MyTheme" > </activity>
2.界面布局
这个部分是很死的类容,只要搞清每种布局的属性就行了,再改一些布局的基本属性,多种布局嵌套使用,这些搞定了,你的界面想怎么布局就就怎么布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".AnswerActivity" > <TextView /> <TableLayout ======嵌套一个布局 </TableLayout> </RelativeLayout>
3.界面跳转
界面的跳转是一件再容易不过的事情了
startActivity(new Intent(this,AnswerActivity.class));
so easy有木有
4.界面的销毁
这个东西更简单,只要this.finish();就OK了,不过还有事情不要忘记做了,就是这个界面的线程,你可以用标记来结束线程,或是重写Activity的onDestroy方法,这个方法很有用,它处在安卓页面生命周期的末尾,所以我们可以再这个方法里面写一些销毁页面后的善后工作,比如结束线程
public void run() { while(!stopflag){ } protected void onDestroy() { //这里可以写一些善后工作 super.onDestroy(); stopflag=true; }
5.屏蔽返回键或菜单键
返回键的的屏蔽或是设置询问对话框是很有必要的,我几乎每一个界面都屏蔽了原来Activity的返回键功能,这可以通过重写来实现
public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ new Exit(this);//弹出询问对话框 } return false; }
6.用SurfaceView画图
要用好这玩意的关键在于三点:
1.获取SurfaceHolder,hold住全场,
2.实现SurfaceHolder.Callback接口并且添加回调函数
3.锁定画布,画图,提交画布
下面是一个SurfaceView的模板代码
//这是强哥讲的另一种自定义组件,一般是用这个做游戏的 public class MySurfaceView extends SurfaceView implements Callback,Runnable{ private ArrayList<Entity> list = new ArrayList<Entity>(); private SurfaceHolder holder; private Paint paint=new Paint(); private boolean runflag=true; private static boolean stopflag=false; public MySurfaceView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MySurfaceView(Context context) { this(context, null); } public MySurfaceView(Context context, AttributeSet attrs) { this(context, attrs, 0); holder=this.getHolder(); holder.addCallback(this); } public void surfaceCreated(SurfaceHolder holder) { Thread t=new Thread(this); t.start(); } public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { } public void surfaceDestroyed(SurfaceHolder holder) { runflag=false; } public void run() { while(runflag){ if(stopflag)continue; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } Canvas canvas=null; try { canvas=holder.lockCanvas(); paint.setStyle(Style.FILL); paint.setColor(Color.BLACK); canvas.drawRect(0,0, this.getWidth(), this.getHeight(), paint); for(int i=0;i<list.size();i++){ list.get(i).draw(canvas); list.get(i).move(); } } catch (Exception e) { // TODO: handle exception }finally{ //画布画完后要释放 if(runflag){ holder.unlockCanvasAndPost(canvas); } } } } }
7.获取权限
如果我们想使用一些系统服务,那么久要获取相应的权限,这里方法很简单,在主配置文件里加一行权限的获取就行了
?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.foolgame" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application> </application> <uses-permission android:name="android.permission.VIBRATE"/>
要注意的是,请写在application之外,上面是我写的获取震动权限,不写的话,调用震动方法时就会报错