其实说实话,还是不怎么爱写博客,索性不勉强自己,但今天想写点东西,关于安卓的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之外,上面是我写的获取震动权限,不写的话,调用震动方法时就会报错