1. Layout
File: main.xml
2. Java Code
File: PACMANActivity.java package us.blackturtle.pacman; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.RectF; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; public class PACMANActivity extends Activity { /** Called when the activity is first created. */ public int dir; int bot, top, binc, tinc, x, y, xinc, yinc, phase; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); bot=20; top=320; binc=-2; tinc=4; x=100; y=52; xinc=5; yinc=5; phase=1; setContentView(new PacPanel(this)); } class PacPanel extends SurfaceView implements SurfaceHolder.Callback{ private PacThread pthread; public PacPanel(Context context){ super(context); getHolder().addCallback(this); pthread = new PacThread(getHolder(), this); } @Override public void onDraw(Canvas canvas){ Paint paint = new Paint(); paint.setStyle(Style.FILL); paint.setColor(Color.RED); canvas.drawRect(0,0,canvas.getWidth(), canvas.getHeight(), paint); paint.setColor(Color.BLACK); canvas.drawRect(50,50,canvas.getWidth()-50, canvas.getHeight()-50, paint); paint.setColor(Color.CYAN); canvas.drawRect(104,104,canvas.getWidth()-104, canvas.getHeight()-104, paint); paint.setStyle(Style.STROKE); paint.setColor(Color.BLACK); paint.setTextSize(80); paint.setStrokeWidth(6); canvas.drawText("blackturtle.us", 160, 260, paint); RectF o2 = new RectF(x,y,x+50,y+50); if(phase==1 || phase==3){ if(xinc==5) { //phase 1 //yellow body paint.setColor(Color.YELLOW); paint.setStyle(Style.FILL); canvas.drawArc(o2, bot,top,true,paint); //outline in blue paint.setColor(Color.BLUE); paint.setStrokeWidth(3); paint.setStyle(Style.STROKE); canvas.drawArc(o2, bot,top,true,paint); } else { //phase 3 //yellow body paint.setColor(Color.YELLOW); paint.setStyle(Style.FILL); canvas.drawArc(o2, bot+180,top,true,paint); //outline in blue paint.setColor(Color.BLUE); paint.setStrokeWidth(3); paint.setStyle(Style.STROKE); canvas.drawArc(o2, bot+180,top,true,paint); } //eyes paint.setColor(Color.BLACK); paint.setStyle(Style.FILL); canvas.drawCircle(x+25+xinc, y+15, 5, paint); x+=xinc; if(x<55){ phase=4; yinc=-5; } else if(x>canvas.getWidth()-104){ phase=2; yinc=5; } } else{ //phase 2 or phase 4 if(xinc==5) { //phase 2 //yellow body paint.setColor(Color.YELLOW); paint.setStyle(Style.FILL); canvas.drawArc(o2, bot+90,top,true,paint); //outline in blue paint.setColor(Color.BLUE); paint.setStrokeWidth(3); paint.setStyle(Style.STROKE); canvas.drawArc(o2, bot+90,top,true,paint); } else { //phase 4 //yellow body paint.setColor(Color.YELLOW); paint.setStyle(Style.FILL); canvas.drawArc(o2, bot+270,top,true,paint); //outline in blue paint.setColor(Color.BLUE); paint.setStrokeWidth(3); paint.setStyle(Style.STROKE); canvas.drawArc(o2, bot+270,top,true,paint); } //eyes paint.setColor(Color.BLACK); paint.setStyle(Style.FILL); if(phase==2) canvas.drawCircle(x+15, y+25, 5, paint); else canvas.drawCircle(x+35, y+25, 5, paint); y+=yinc; if(y<55){ phase=1; xinc=5; } else if(y>canvas.getHeight()-105){ phase=3; xinc=-5; } } // change values for mouth opening and closing bot+=binc; top+=tinc; if(top>359) { tinc=-4; } else if(top<320) { tinc=4; } if(bot<1) { binc=2; } else if(bot>20) { binc=-2; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){ //stub } @Override public void surfaceCreated(SurfaceHolder holder){ pthread.setRunning(true); pthread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder){ boolean retry = true; pthread.setRunning(false); while(retry){ try{ pthread.join(); retry=false; }catch(InterruptedException e){ //repeat until successful } } } } class PacThread extends Thread{ private SurfaceHolder sHolder; private PacPanel sPanel; private boolean srun=false; public PacThread(SurfaceHolder s, PacPanel p){ sHolder = s; sPanel = p; } public void setRunning(boolean run){ srun=true; } @Override public void run(){ Canvas c; while(srun){ try{ Thread.sleep(100); }catch(InterruptedException ie){} c=null; try{ c=sHolder.lockCanvas(null); synchronized(sHolder){ sPanel.onDraw(c); } }finally{ if(c != !null){ sHolder.unlockCanvasAndPost(c); } } } } } }
SCREEN SHOT: