您的位置:首页 > 移动开发 > Android开发

android:SurfaceView绘制图形

2016-04-03 23:05 387 查看

SurfaceView的特点:

可以在主线程之外的线程中向屏幕绘图,可以避免在进行复杂的绘图的时候造成主线程阻塞,从而提高了程序的反应速度。

在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

任务:

使用SurfaceView创建一个组合图形,并使其垂直方向移动

实现方法:

1)自定义一个View使其继承自SurfaceView,并实现SurfaceHolder.Callback接口

2)创建一个容器Container来储存两个图形

3)分别创建两个不同的图形

代码:

MainActivity.java:

package com.example.kanzaki.learndrawapi;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//使用自定义的视图
setContentView(new MyView(this));
}
}

MyView.java:

package com.example.kanzaki.learndrawapi;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.Timer;
import java.util.TimerTask;

/**
* Created by Kanzaki on 2016/4/3.
*/
public class MyView extends SurfaceView implements SurfaceHolder.Callback {

private Container container;
private Circle circle;
private Rect rect;
private Timer timer;
private TimerTask timerTask;

//设置延时任务
public void startTime() {
timer = new Timer();
timerTask=new TimerTask() {
@Override
public void run() {
draw();
}
};
timer.schedule(timerTask,100,100);

}
public void stopTime() {
if (timer != null) {
timer.cancel();
timer = null;
}
}

public MyView(Context context) {
super(context);
container = new Container();
circle = new Circle();
rect = new Rect();
//将圆添加到方块中
rect.addChild(circle);
//将方块添加到Container容器中
container.addChild(rect);
//添加回掉函数
getHolder().addCallback(this);
}

private void draw() {
//锁定画布
Canvas canvas = getHolder().lockCanvas();
//设置画布背景为白色
canvas.drawColor(Color.WHITE);
container.draw(canvas);
//解锁画布
getHolder().unlockCanvasAndPost(canvas);
}

//surface创建的时候触发
@Override
public void surfaceCreated(SurfaceHolder holder) {

}

//surface改变的时候触发
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
startTime();

}

//surface销毁的时候触发
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//避免程序在推出后还在运行
stopTime();
}
}


Container.java:

package com.example.kanzaki.learndrawapi;

import android.graphics.Canvas;

import java.util.ArrayList;
import java.util.List;

/**
* Created by Kanzaki on 2016/4/3.
*/
public class Container {
//用一个集合来保存组合图形
private List<Container> childernList;
//设置平移的坐标
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 Container() {
childernList = new ArrayList<Container>();

}

public void draw(Canvas canvas) {
canvas.save();
canvas.translate(getX(),getY());
//遍历集合中的所有成员,并将其绘制
childernListView(canvas);
for (Container c : childernList) {
c.draw(canvas);
}
canvas.restore();
}

public void childernListView(Canvas canvas) {

}

public void addChild(Container childern) {
childernList.add(childern);

}

public void removeChild(Container children) {

childernList.remove(children);
}
}


Rect.java:

package com.example.kanzaki.learndrawapi;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

/**
* Created by Kanzaki on 2016/4/3.
*/
public class Rect extends Container {
private Paint paint;
public Rect() {
paint = new Paint();
paint.setColor(Color.RED);
}

@Override
public void childernListView(Canvas canvas) {
super.childernListView(canvas);
canvas.drawRect(0,0,100,100,paint);
this.setY(this.getY()+1);
}
}


Circle.java:

package com.example.kanzaki.learndrawapi;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

/**
* Created by Kanzaki on 2016/4/3.
*/
public class Circle extends Container {
private Paint paint;
public Circle() {
paint = new Paint();
paint.setColor(Color.BLUE);

}

@Override
public void childernListView(Canvas canvas) {
super.childernListView(canvas);
canvas.drawCircle(50,50,50,paint);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息