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