开箱子--程序布局、动态设置背景图片、退出整个程序

游戏资源已上传 ,强迫症比玩游戏。

今天写了个简单的小游戏,里面涉及到了不使用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);
		}
		
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值