游戏资源已上传 ,强迫症比玩游戏。
今天写了个简单的小游戏,里面涉及到了不使用XML创建界面布局(不推荐使用,除非是可变界面)而是编程语言来实现布局,动态更改背景图片,以及退出程序不返回上一个界面而是退出整个程序等的一些知识点。
首先是界面布局,请看一下代码示例:
public View createView(){
//程序构建界面,不推荐.除非可变界面
bStart=new Button(this);
bStart.setText("点击这里,重新开始");
bStart.setTextColor(Color.WHITE);//给按钮的文字设置颜色
bStart.setBackgroundColor(Color.rgb(187, 22, 9));//设置按钮的背景色
buts = new SubButton[size][size];//SubButton是Button类的子类,因为在这里用按钮表示箱子,所以有下标属性,以及一个布尔值判断该箱子是否打开过
//创建主界面线性布局面板,垂直
LinearLayout main = new LinearLayout(this);
main.setLayoutParams(//设置布局规则,不设置报错
new LinearLayout.LayoutParams(//使用内部类,线性布局专用布局参数对象
LayoutParams.MATCH_PARENT,//最终量 匹配上级
LayoutParams.MATCH_PARENT
,1));//参数3 weight权重:多个对象都是1,表示平分整个屏幕;如果只有一个对象则是占满
main.setOrientation(LinearLayout.VERTICAL);//垂直排放
main.addView(bStart);
for (int row = 0; row <size; row++) {
//每一行一个线性布局
LinearLayout line = new LinearLayout(this);
line.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT,1));
line.setOrientation(LinearLayout.HORIZONTAL);
for (int col = 0; col < size; col++) {
buts[row][col] = new SubButton(this);
buts[row][col].setRow(row);
buts[row][col].setCol(col);
buts[row][col].setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT,1));
line.addView(buts[row][col]);//粘贴到面板上
buts[row][col].setOnClickListener(listener);//注册监听器
setBgImage(buts[row][col], preImg);//更改背景图片的方法,也可以buts[i][j].setBackground(Drawable drawable)直接设置背景图片
<span style="white-space:pre"> </span>//
}
main.addView(line);//当前行粘贴到总面板上
}
return main;
}
使用的线性布局,整理好整个布局的框架就会发现其实不难。接着给出设置背景图片的方法,我自己使用的是下面的示例
/**
* 改变每个按钮的背景图片
* @param but 要改变图片的按钮
* @param bitmap 背景图片对应的id,比如R.drawable.ic_launcher
*/
public void setBgImage(SubButton but,int imgID){
//使用可绘制图像作为按钮的背景图
but.setBackgroundResource(imgID);
}
设置背景图像的方法有:
1. setBackground (Drawable drawable)方法(该方法只是适用于API16及以上的版本,安卓手机或者模拟器是安卓4.1.2以下对的设备都会报异常,并且要在配置文件中将最低兼容改为api16及以上)
首先获得位图:Bitmap bitMap=BitmapFactory.decodeResource(getResources(), R.drawble.ic_launcher);//第一个参数是获取当前资源,第二个参数则是资源下对于的id
然后创建一个可绘制资源对象 Drawable drawable=new BitmapDrawable(getResources(),bitMap);
最后设置背景图片 setBackground ( drawable)
由于Drawable是个抽象类,可以引用的子类很多,比如BitmapDrawable等,详细内容,有的作者总结的很好,给个网址:http://www.cnblogs.com/feisky/archive/2010/01/08/1642567.html 供大家学习
2.setBackgroundResource(int resId)方法
这个方法就是我上面的设置背景图片中用到的。
3、setBackgroundDrawable (Drawable drawable),同第一种方法一样使用,只不过是老版本的方法名称,已被谷歌注解为不推荐使用。既然不推荐使用了,那还是用剩下的其他方法吧。但是如果手机按安卓版本或模拟器选择的安卓版本过低,可以用这个方法或者方法2.
最后,关于退出整个程序的方法,我自己是首先定义了一个类,来实现存储每一个界面
package com.example.myopenbox;
import java.util.ArrayList;
import android.app.Activity;
/**
* 界面列表类,定义了一个静态属性和静态方法,在构造方法中将该静态属性实例化,构造函数私有化保证只有唯一的链表对象来存储所有界面对象
*/
public class ActivityList {
/**
* 数组列表,只有一个实例,每次新建一个界面就加入该链表实例中
*/
private static ArrayList<Activity> list;
private ActivityList(){
list=new ArrayList<Activity>();
}
public static ArrayList<Activity> getList(){
if (list==null) {
list=new ArrayList<Activity>();
}
return list;
}
}
写一个方法得到ArrayList<Activity>对象,遍历就可以关闭
/**
* 关闭程序的所有界面,退出程序
*/
public void finishMyActivities(){
ArrayList<Activity> list=ActivityList.getList();
for (Activity activity:list) {
activity.finish();
}
}
在onKeyDown方法里面调用该方法就可以了,顺便附上退出程序的方法
/**
* 重写按键按下事件,返回键两次按下间隔2秒之内,退出程序
*/
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode==KeyEvent.KEYCODE_BACK) {
if (new Date().getTime()-lastTime<2000) {
//两秒之内按下两次返回键,退出整个程序
finishMyActivities();
}else {
Toast.makeText(getApplicationContext(), "请再按一次返回键退出程序", Toast.LENGTH_LONG).show();
lastTime=new Date().getTime();//lastTime是个long整型变量,记录第一次按返回键的时间,值是从1970年1月1日到现在的毫秒差
}
return true;
}else
{
return super.onKeyDown(keyCode, event);
}
}