一个很基础的surfaceView使用

来源:互联网 发布:sql注入语句示例大全 编辑:程序博客网 时间:2024/05/18 10:06

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();            }




原创粉丝点击