Android学习(20)SurfaceView_表层视图
SurfaceView:
SurfaceView在游戏开发中有着举足轻重的地位,它对于画面的控制有着更大的自由度。
SurfaceView的特性:
可以在主线程之外的线程中向屏幕绘图,这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景,人物,动画等等尽量在画布Canvas中画出。
SurfaceView的使用:
- 首先要继承SurfaceView并实现SurfaceView.Callback接口
- 绘制前要锁定画布(SurfaceHolder.lockCanvas())以及解锁画布(SurfaceHolder.unlockCanvasAndPost(Canvas canvas))
1.用SurfaceView绘制文字
(1)MySurfaceView.java
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
//实例化一个画笔
private Paint paint = new Paint();
public MySurfaceView(Context context) {
super(context);
//添加回调函数
getHolder().addCallback(this);
//设置画笔颜色
paint.setColor(Color.BLUE);
}
//绘图
public void draw() {
//锁定画布
Canvas canvas = getHolder().lockCanvas();
//设置画布颜色
canvas.drawColor(Color.WHITE);
//绘制文字
canvas.drawText("这是一个SurfaceView的使用",50,50,paint);
//解锁画布
getHolder().unlockCanvasAndPost(canvas);
}
//当SurfaceView创建时调用
@Override
public void surfaceCreated(SurfaceHolder holder) {
draw();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
(2)SurfaceViewActivity.java
public class SurfaceViewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MySurfaceView(this));
}
}
2.用SurfaceView实现绘制的图形在屏幕内自动移动
(1)MySurfaceView2.java
public class MySurfaceView2 extends SurfaceView implements SurfaceHolder.Callback {
//设置矩形边距
private float x = 0;
private float y = 0;
private float speedx = 50;
private float speedy = 50;
//设置每次增加的边距(每次移动的距离)
private float addx = 20;
private float addy = 20;
//实例化一支画笔
private Paint paint = new Paint();
//创建一个Timer
private Timer timer;
private TimerTask task;
public MySurfaceView2(Context context) {
super(context);
//回调函数
getHolder().addCallback(this);
//画笔颜色
paint.setColor(Color.RED);
}
//绘图
public void draw(){
//锁定画布
Canvas canvas = getHolder().lockCanvas() ;
//画布的颜色
canvas.drawColor(0xffffffff);
//绘制矩形
canvas.drawRect(x,y,speedx + x,speedy +y,paint);
x += addx;
y += addy;
if (x < 0) {
addx = Math.abs(addx);
}
//判断边界,触碰到边界就反弹
if (y<0) {
addy = Math.abs(addy);
}
if (x > getWidth() - speedx) {
addx = -Math.abs(addx);
}
if (y > getHeight() - speedy) {
addy = -Math.abs(addy);
}
//解锁画布
getHolder().unlockCanvasAndPost(canvas);
}
//启动timer
public void start() {
//实例化timer
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
//timer每次执行就绘制一次画布
draw();
}
};
//延迟1秒执行,每0.1秒执行一次
timer.schedule(task, 1000,100);
}
//停止timer
public void stop() {
timer.cancel();
}
//当SurfaceView创建时调用start()
@Override
public void surfaceCreated(SurfaceHolder holder) {
start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
//当SurfaceView停止销毁是调用stop()
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stop();
}
}
(2)SurfaceView2Activity
public class SurfaceView2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MySurfaceView2(this));
}
}
声明:
1.知识点来源于《网易云课堂》——《Android基础视频教程》
2.本文只用于本人自身学习记录,如有侵权,请立即通知本人更改或删除