欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android(一)——SurfaceView介绍

程序员文章站 2022-05-30 13:46:23
...

What is SurfaceView?

文档中说,SurfaceView就是在窗体上挖一个洞,它就显示在这个洞里。
类似这样:
Android(一)——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);
        
    }
}
相关标签: Android