SurfaceView介绍

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);
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值