Android SurfaceView绘制组合图形
完整代码如下:
MyOwnView.java
public class MyOwnView {
private List<MyOwnView> views = null;
private float x = 0, y = 0;
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
public MyOwnView() {
views = new ArrayList<MyOwnView>();
}
public void addView(MyOwnView myOwnView) {
views.add(myOwnView);
}
public void removeView(MyOwnView myOwnView) {
views.remove(myOwnView);
}
public void draw(Canvas canvas) {
canvas.save();
canvas.translate(getX(), getY());
drawView(canvas);
for (MyOwnView myOwnView : views) {
myOwnView.draw(canvas);
}
canvas.restore();
}
public void drawView(Canvas canvas) {}
}
Rect.java
public class Rect extends MyOwnView {
private Paint paint = null;
public Rect() {
paint = new Paint();
paint.setColor(Color.RED);
}
@Override
public void drawView(Canvas canvas) {
super.drawView(canvas);
canvas.drawRect(0, 0, 100, 100, paint);
this.setY(this.getY() + 1);
}
}
Circle.java
public class Circle extends MyOwnView {
private Paint paint = null;
public Circle() {
paint = new Paint();
paint.setColor(Color.BLUE);
}
@Override
public void drawView(Canvas canvas) {
super.drawView(canvas);
canvas.drawCircle(50, 50, 50, paint);
}
}
MyView.java
public class MyView extends SurfaceView implements SurfaceHolder.Callback{
private MyOwnView myOwnView;
private Rect rect;
private Circle circle;
public MyView(Context context) {
super(context);
myOwnView = new MyOwnView();
rect = new Rect();
circle = new Circle();
rect.addView(circle);
myOwnView.addView(rect);
getHolder().addCallback(this);
}
public void draw() {
Canvas canvas = getHolder().lockCanvas();
canvas.drawColor(Color.WHITE);
myOwnView.draw(canvas);
getHolder().unlockCanvasAndPost(canvas);
}
private Timer timer = null;
private TimerTask task = null;
public void startTimer() {
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
draw();
}
};
timer.schedule(task, 100, 100);
}
public void stopTimer() {
if(timer != null) {
timer.cancel();
timer = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
startTimer();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopTimer();
}
}
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
}