SurfaceView的用法
2016-05-08 09:51
162 查看
新建工程UsingSurfaceView
新建一个类GameView继承至SurfaceView并实现Callback接口
添加构造方法,并复写Callback的三个未实现的方法
创建一个容器Contanier承载所有的View
public class Contanier {
private List<Contanier> children=null;
public Contanier(){
children = new ArrayList<Contanier>();
}
public void draw(Canvas canvas){
childrenView(canvas);
for (Contanier c:children) {
c.draw(canvas);
}
}
public void childrenView(Canvas canvas){
}
public void addChildrenView(Contanier child){
children.add(child);
}
public void removeChildrenView(Contanier child){
children.remove(child);
}
}
新建一个Contanier子类Rect
public class Rect extends Contanier{
private Paint paint = null;
public Rect(){
paint=new Paint();
paint.setColor(Color.RED);
}
//复写childrenView方法
public void childrenView(Canvas canvas) {
super.childrenView(canvas);
canvas.drawRect(0, 0, 100, 100, paint);
}
}
再新建一个Contanier子类
public class Circle extends Contanier{
private Paint paint=null;
public Circle(){
paint=new Paint();
paint.setColor(Color.BLUE);
}
@Override
public void childrenView(Canvas canvas) {
// TODO Auto-generated method stub
super.childrenView(canvas);
canvas.drawCircle(50, 50, 50, paint);
}
}
返回类GameView进行初始化
private Contanier contanier;
private Rect rect;
private Circle circle;
public GameView(Context context) {
super(context);
contanier = new Contanier();
rect = new Rect();
circle = new Circle();
rect.addChildrenView(circle);
contanier.addChildrenView(rect);
//添加回调
getHolder().addCallback(this);
}
在surfaceChanged方法中调用draw方法
在MainActivity中
setContentView(new GameView(this));
使绘制的图形移动起来
修改Contanier类
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 void draw(Canvas canvas){
canvas.save();
canvas.translate(getX(), getY());
childrenView(canvas);
for (Contanier c:children) {
c.draw(canvas);
}
canvas.restore();
}
修改Rect类的childrenView方法
public void childrenView(Canvas canvas) {
super.childrenView(canvas);
canvas.drawRect(0, 0, 100, 100, paint);
this.setY(getY()+1);
}
对移动操作 修改类GameView
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;
}
}
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
startTimer();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
stopTimer();
}
新建一个类GameView继承至SurfaceView并实现Callback接口
添加构造方法,并复写Callback的三个未实现的方法
创建一个容器Contanier承载所有的View
public class Contanier {
private List<Contanier> children=null;
public Contanier(){
children = new ArrayList<Contanier>();
}
public void draw(Canvas canvas){
childrenView(canvas);
for (Contanier c:children) {
c.draw(canvas);
}
}
public void childrenView(Canvas canvas){
}
public void addChildrenView(Contanier child){
children.add(child);
}
public void removeChildrenView(Contanier child){
children.remove(child);
}
}
新建一个Contanier子类Rect
public class Rect extends Contanier{
private Paint paint = null;
public Rect(){
paint=new Paint();
paint.setColor(Color.RED);
}
//复写childrenView方法
public void childrenView(Canvas canvas) {
super.childrenView(canvas);
canvas.drawRect(0, 0, 100, 100, paint);
}
}
再新建一个Contanier子类
public class Circle extends Contanier{
private Paint paint=null;
public Circle(){
paint=new Paint();
paint.setColor(Color.BLUE);
}
@Override
public void childrenView(Canvas canvas) {
// TODO Auto-generated method stub
super.childrenView(canvas);
canvas.drawCircle(50, 50, 50, paint);
}
}
返回类GameView进行初始化
private Contanier contanier;
private Rect rect;
private Circle circle;
public GameView(Context context) {
super(context);
contanier = new Contanier();
rect = new Rect();
circle = new Circle();
rect.addChildrenView(circle);
contanier.addChildrenView(rect);
//添加回调
getHolder().addCallback(this);
}
在surfaceChanged方法中调用draw方法
在MainActivity中
setContentView(new GameView(this));
使绘制的图形移动起来
修改Contanier类
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 void draw(Canvas canvas){
canvas.save();
canvas.translate(getX(), getY());
childrenView(canvas);
for (Contanier c:children) {
c.draw(canvas);
}
canvas.restore();
}
修改Rect类的childrenView方法
public void childrenView(Canvas canvas) {
super.childrenView(canvas);
canvas.drawRect(0, 0, 100, 100, paint);
this.setY(getY()+1);
}
对移动操作 修改类GameView
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;
}
}
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
startTimer();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
stopTimer();
}
相关文章推荐
- selenium_采集药品数据1_采集第一页表格
- (1)NSThread
- swift基础学习(04)[闭包、函数、枚举、类和结构体]
- zookeeper分布式锁
- 为sql server 增加 parseJSON 和 ToJSON 函数
- zookeeper分布式锁
- C#版 选择法、冒泡法、插入法和快速排序法分析与对比
- java 死锁产生原因及解锁
- azure 云上 oracle11.2.0.4里dataguard归档日志传输 1034 问题详细解决过程
- java或者jsp中修复会话标识未更新漏洞
- 工厂模式
- 10期4月份博客期刊
- [shell] 文本操作
- [转]javascript中基本类型和引用类型的区别分析
- linux grep
- linux grep
- Vim for Python & Normal Plugins & Vundle
- ios Sqlite 的基本使用
- Java千百问_06数据结构(012)_如何遍历数组
- java中public private protected default的区别