Android(一)——SurfaceView介绍
程序员文章站
2022-05-30 13:46:23
...
What is SurfaceView?
文档中说,SurfaceView就是在窗体上挖一个洞,它就显示在这个洞里。
类似这样:
(就像是从望远镜里看出去一样)
而其他View就显示在窗体上,充当窗体本身。在继承关系上,SurfaceView是View的子类。
Why SurfaceView?
我们知道,出于安全考虑,子线程是无法直接touch到界面的,之前我们可以采用Handler机制实现子线程的“间接”touch,但性能不佳。而SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制。又由于不会占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,另一方面又不会导致用户输入得不到及时响应。它是专门为制作游戏而生的,功能强大。
Quick Start
下面我们快速部署一个基于SurfaceView的小球运动demo。
Ball类
public class Ball implements Runnable{
SurfaceHolder holder;
float x = 0;
float y = 0;
public Ball(SurfaceHolder holder){
this.holder = holder;
}
@Override
public void run() {
for(int i = 0; i < 100; i++) {
//获取画布
Canvas canvas = holder.lockCanvas();
//画笔
Paint p = new Paint();
p.setColor(0xffff00ff);
//画图
canvas.drawCircle(x, y, 20, p);
//释放
holder.unlockCanvasAndPost(canvas);
x += 0.5;
y += 0.7;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
实现Callback
/**
* Callback相当于是监听器
*/
public class BallHolder implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
Ball b = new Ball(holder);
new Thread(b).start();
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { }
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) { }
}
MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找出组件
SurfaceView surface = (SurfaceView)this.findViewById(R.id.surface1);
//实现callback
BallHolder call = new BallHolder();
//获取SurfaceHolder
SurfaceHolder s = surface.getHolder();
//为SurfaceHolder添加callback
s.addCallback(call);
}
}