一个很基础的surfaceView使用

surfaceView可以用来自定义view,与view的区别是:view是在主线程绘制的,如果cpu垃圾或者计算量大,超过16MS的刷新频率,页面就GG。对于surfaceview,他的绘制是在子线程进行的。

一个简单的demo,surfaceview的简单使用:


1.跟自定义view一样,继承surfaceview。然后拿到重要的surfaceviewHolder和该surfaceview的canvas,然后画笔paint和自定义view一样,自己新建

public class MySurfaceView extends SurfaceView {
    public SurfaceHolder surfaceHolder;
    public Canvas canvas;
    public boolean CanDraw;
    public MySurfaceView(Context context) {
        super(context);
    }
    public MySurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        surfaceHolder = getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(final SurfaceHolder surfaceHolder) {
                CanDraw = true;
                //当创建完成,就开始绘制
//开始绘制
                new Thread() {
                    @Override
                    public void run() {
                        //拿到画布
                        canvas = surfaceHolder.lockCanvas();
                        //清屏操作,
                        canvas.drawColor(Color.WHITE);
                        Paint paint = new Paint();
                        //抗锯齿
                        paint.setAntiAlias(true);
                        //FC3C39
                        paint.setColor(Color.parseColor("#00ffff"));
                        paint.setStrokeWidth((float) 20.0);
                        canvas.drawLine(0, 0, 100, 100, paint);
                        //提交所做的修改
                        surfaceHolder.unlockCanvasAndPost(canvas);
                    }
                }.start();
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                CanDraw = false;
            }
        });

    }

    public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

}


2.在主线程中通过新开子线程去操作surfaceview的绘制。

   findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //点击按钮之后,重新画一根线
               new Thread() {
                    @Override
                    public void run() {
                        if(surfaceView.CanDraw){
                            //此时canvas没有被销毁,还可以绘制,当走到surfaceDestroyed时,surfaceViewHolder就销毁了
                            surfaceView.canvas = surfaceView.surfaceHolder.lockCanvas();
                            //清屏操作,
                            surfaceView.canvas.drawColor(Color.WHITE);
                            Paint paint = new Paint();
                            //抗锯齿
                            paint.setAntiAlias(true);
                            //FC3C39
                            paint.setColor(Color.parseColor("#00ffff"));
                            paint.setStrokeWidth((float) 20.0);
                            Random random = new Random();
                            surfaceView.canvas.drawLine(random.nextInt(10)*10, 0, 500, 500, paint);
                            //提交所做的修改
                            surfaceView.surfaceHolder.unlockCanvasAndPost(surfaceView.canvas);
                        }else {
                            Toast.makeText(MainActivity.this,"surfaceviewHolder已经被销毁",Toast.LENGTH_SHORT).show();
                        }
                    }
                }.start();
            }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值