1. Layout
File main.xml
2. Java Code
File: MOVE_STUFFActivity.java
package us.blackturtle.movestuff; import android.app.Activity; import android.os.Bundle; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; import java.util.*; public class MOVE_STUFFActivity extends Activity { /** Called when the activity is first created. */ public int xcors[]; public int ycors[]; public int xdirs[]; public int ydirs[]; public int color_selection[] = { Color.RED, Color.CYAN, Color.WHITE, Color.MAGENTA, Color.YELLOW, Color.LTGRAY, Color.GREEN, Color.BLUE }; public int colors[]; Random r; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(new Panel(this)); } class Panel extends SurfaceView implements SurfaceHolder.Callback { private StuffThread sthread; public Panel(Context context) { super(context); getHolder().addCallback(this); sthread = new StuffThread(getHolder(), this); xcors = new int[20]; ycors = new int[20]; xdirs = new int[20]; ydirs = new int[20]; colors = new int[20]; r = new Random(); for(int i = 0; i<20; i++){ xcors[i] = 200; ycors[i] = 300; xdirs[i] = Math.abs(r.nextInt(7))+1; ydirs[i] = Math.abs(r.nextInt(7))+1; colors[i] = i%color_selection.length; if(i%4==0) ydirs[i]*=-1; else if(i%4==1) xdirs[i]*=-1; else if(i%4==2) { xdirs[i]*=-1; ydirs[i]*=-1; } } } @Override public void onDraw(Canvas canvas){ Paint paint = new Paint(); paint.setStyle(Style.FILL); paint.setColor(Color.BLACK); canvas.drawRect(0,0,canvas.getWidth(), canvas.getHeight(), paint); paint.setStrokeWidth(3); for(int i = 0; i<20; i++){ paint.setColor(color_selection[colors[i]]); canvas.drawCircle(xcors[i], ycors[i], 10, paint); xcors[i]+=xdirs[i]; ycors[i]+=ydirs[i]; if(xcors[i]>canvas.getWidth() || xcors[i]<0) xdirs[i]*=-1; if(ycors[i]>canvas.getHeight() || ycors[i]<0) ydirs[i]*=-1; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // stub } @Override public void surfaceCreated(SurfaceHolder holder) { sthread.setRunning(true); sthread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; sthread.setRunning(false); while (retry) { try{ sthread.join(); retry = false; } catch (InterruptedException e) { // repeat until successful } } } } class StuffThread extends Thread { private SurfaceHolder sHolder; private Panel sPanel; private boolean srun = false; public StuffThread(SurfaceHolder surfaceHolder, Panel panel) { sHolder = surfaceHolder; sPanel = panel; } public void setRunning(boolean run) { srun = run; } @Override public void run() { Canvas c; try{ Thread.sleep(100); }catch(InterruptedException ie){} while(srun) { c = null; try{ c = sHolder.lockCanvas(null); synchronized (sHolder) { sPanel.onDraw(c); } } finally { if(c != null) { sHolder.unlockCanvasAndPost(c); } } } } } }
Screen Shot: