public class MainActivity extends Activity {
private GameUI gameUI;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gameUI = new GameUI(getApplicationContext());
setContentView(gameUI);
}
//处理屏幕的点击事件
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
gameUI.handleTouch(event);
return super.onTouchEvent(event);
}
}
public class GameUI extends SurfaceView implements SurfaceHolder.Callback{
boolean flag ;
private RenderThread thread;
private SurfaceHolder h;
//-----三个对象------------------
private Man man;
private List<face> falist;
private MyButton btn;
public GameUI(Context context) {
super(context);
h = getHolder();
h.addCallback(this);
}
public class RenderThread extends Thread{
public void run(){
while(flag){
try{
drawUI();
}catch(Exception e){
e.printStackTrace();
}
}
}
//------------------------------------------------------------------------
//绘制界面
private void drawUI() {
// TODO Auto-generated method stub
Canvas lockCanvas = h.lockCanvas();
//--------------------绘制了一个矩形---------------------------------------
Paint paint = new Paint();
paint.setColor(Color.GRAY);
//----------绘制屏幕大小的矩形,把之前绘制的全部盖在下边---------------------
lockCanvas.drawRect(0, 0,getWidth(),getHeight(),paint);
//------------------------------------------------------------ -----------
man.drawSelf(lockCanvas);//把男孩绘制到屏幕上
// if(fa != null){
// fa.drawSelf(lockCanvas);//把笑脸绘制在界面上
// fa.move();
// }
for(face fa : falist){
fa.drawSelf(lockCanvas);//把笑脸绘制在界面上
fa.move();
if(fa.position.x<0||fa.position.x>getWidth()||fa.position.y<0||fa.position.y>getHeight()){
falist.remove(fa);
}
}
btn.drawSelf(lockCanvas);//把按钮绘制在界面上
h.unlockCanvasAndPost(lockCanvas);
}
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
}
@Override
public void surfaceCreated(SurfaceHolder h) {
Bitmap manbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.avatar_boy);
man = new Man(manbitmap, new Point(0,0));//创建了 小人,还没有绘制到界面上
falist = new CopyOnWriteArrayList<face>();//可以在集合遍历的过程中增加或者删除元素。堆内存的开销大,对数组进行了一次复制!
//------------现在不在这个位置位置绘制笑脸,在小人的最上绘制------
// Bitmap facebitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rating_small);
// fa = new face(facebitmap,new Point(0,0));//创建了笑脸
//-----------------按钮---------------------------------------------------------
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_default);
Bitmap pressbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_press);
btn = new MyButton(bitmap, new Point(100,getHeight()-100),pressbitmap);//创建了一个button,还没有绘制到屏幕上
btn.setClicklistener(new MyButton.OnClickListener() {
@Override
public void click() {
// TODO Auto-generated method stub
man.move(Man.DOWN);
}
});
thread = new RenderThread();
flag = true;
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
//一般停止线程,都是控制线程的循环
flag = false;
}
public void handleTouch(MotionEvent e){
switch(e.getAction()){
//case MotionEvent.ACTION_MOVE:
//当按下的时候,绘制笑脸
case MotionEvent.ACTION_DOWN:
//拿到按下的xy坐标
int x = (int) e.getRawX();
int y = (int) e.getRawY();
if(btn.isclick(new Point(x,y))){
//man.move(Man.DOWN);
btn.click();
}else{//按下的时候不显示笑脸
face f = man.createface(getContext(),new Point(x,y));
falist.add(f);
}
break;
case MotionEvent.ACTION_UP:
btn.setIsClick(false);//当手指弹起的时候,让按钮点击的状态改为false
break;
default:
break;
}
}
}
//精灵,所有显示界面的一个基类。
public abstract class Sprite {
private Bitmap defaultBitmap;//默认显示的图片
protected Point position;//位置
//放置 图片和位置 为空
public Sprite(Bitmap defaultBitmap, Point position) {
super();
this.defaultBitmap = defaultBitmap;
this.position = position;
}
//绘制自身 就是把图片绘制到位置上
public void drawSelf(Canvas c){
c.drawBitmap(defaultBitmap, position.x,position.y, null);
}
}
public class Man extends Sprite {
public static final int DOWN=0;
public Man(Bitmap defaultBitmap, Point position) {
super(defaultBitmap, position);
// TODO Auto-generated constructor stub
}
//特性方法,创建笑脸
public face createface(Context c,Point touchpoint){
Bitmap facebitmap = BitmapFactory.decodeResource(c.getResources(), R.drawable.rating_small);
face fa = new face(facebitmap,new Point(position.x+50,position.y+50),touchpoint);//创建了笑脸,在小人的坐标上刚好到嘴的地方绘制笑脸。
return fa;
}
public void move(int d){
if(d == DOWN){
this.position.y += 6;
}
}
}
public class face extends Sprite {
//移动的距离是一个固定的值
int speed = 6;
private int tx;
private int ty;
public face(Bitmap defaultBitmap, Point position,Point touch) {
super(defaultBitmap, position);
// TODO Auto-generated constructor stub
int x = touch.x - position.x;
int y = touch.y - position.y;
int d = (int) Math.sqrt(x*x+y*y);
tx = speed*x/d;
ty = speed*y/d;
}
//笑脸移动的方法
public void move(){
this.position.x += tx;
this.position.y += ty;
}
}
public class MyButton extends Sprite {
private OnClickListener clicklistener;
public interface OnClickListener{
void click();
}
public void setClicklistener(OnClickListener clicklistener) {
this.clicklistener = clicklistener;
}
//当按钮被点击的时 调用此方法
public void click(){
if(clicklistener!=null){
clicklistener.click();
}
}
private boolean isclick;//按下的状态
private Bitmap pressBit;
public MyButton(Bitmap defaultBitmap, Point position,Bitmap pressBit) {
super(defaultBitmap, position);
// TODO Auto-generated constructor stub
this.pressBit = pressBit;
}
public void setIsClick(boolean isClick){
this.isclick = isClick;
}
public void drawSelf(Canvas c){
if(isclick){
//绘制一个按下的图片
c.drawBitmap(pressBit, position.x,position.y, null);
}else{
super.drawSelf(c);//绘制默认的图片
}
}
//判断 手指按下的点 是否 在 当前按钮的 图片之中
public boolean isclick(Point touchpoint){
//创建了一个矩形,当前按钮的矩形
Rect rect = new Rect(position.x,position.y,position.x+pressBit.getWidth(),position.y+pressBit.getHeight());
//如果包含,就为点击
isclick = rect.contains(touchpoint.x,touchpoint.y );
return isclick;
}
}