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);
}
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories