美文网首页
SurfaceView小结

SurfaceView小结

作者: Dane_404 | 来源:发表于2019-03-19 23:22 被阅读0次

    1、使用SurfaceView的原因

    View刷新重新绘制的时间间隔是16ms,如果可以在16ms以内绘制完, 则没有什么问题,如果绘制逻辑复杂,更新又很频繁,这样界面就会卡顿,就必须使用SurfaceView了。
    区别:

    • View在主线程中对页面进行刷新,而SurfaceView则开启一个子线程来对页面进行刷新。
    • View在绘图时没有实现双缓冲机制,SurfaceView在底层机制中就实现了双缓冲机制。
    • 双缓冲技术:
      双缓冲技术是游戏开发中的一个重要的技术。当一个动画争先显示时,程序又在改变它,前面还没有显示完,程序又请求重新绘制,这样屏幕就会不停地闪烁。而双缓冲技术是把要处理的图片在内存中处理好之后,再将其显示在屏幕上。双缓冲主要是为了解决 反复局部刷屏带来的闪烁。把要画的东西先画到一个内存区域里,然后整体的一次性画出来。

    2、使用SurfaceView

    做个小Demo,一个涂鸦Demo

    涂鸦:
    public class DoodleSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
        
            private SurfaceHolder mHolder;
            private Paint mPaint;
            private Canvas mCanvas;
            private Path mPath;
        
            public DoodleSurfaceView (Context context) {
                this(context, null);
            }
        
            public DoodleSurfaceView (Context context, AttributeSet attrs) {
                this(context, attrs, 0);
            }
        
            public DoodleSurfaceView (Context context, AttributeSet attrs, int defStyleAttr) {
                super(context, attrs, defStyleAttr);
                init();
                initPaintAndPath();
            }
        
            private void initPaintAndPath() {
                mPaint = new Paint();
                mPaint.setStyle(Paint.Style.STROKE);
                mPaint.setStrokeWidth(5);
                mPaint.setAntiAlias(true);
                mPaint.setColor(Color.BLACK);
                mPath = new Path();
            }
        
            private void init() {
                mHolder = getHolder();
                mHolder.addCallback(this);
                setFocusable(true);
                setKeepScreenOn(true);  //保持屏幕常亮
                setFocusableInTouchMode(true);
            }
        
            //创建时调用
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                mCanvas = mHolder.lockCanvas();
                mCanvas.drawColor(Color.WHITE);
                mHolder.unlockCanvasAndPost(mCanvas);
            }
        
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }
        
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
            }
        
            private void draw() {
                mCanvas = mHolder.lockCanvas();
                mCanvas.drawColor(Color.WHITE);
                mCanvas.drawPath(mPath, mPaint);
                mHolder.unlockCanvasAndPost(mCanvas);
            }
        
            @Override
            public boolean onTouchEvent(MotionEvent event) {
                float x = event.getX();
                float y = event.getY();
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        mPath.moveTo(x, y);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        mPath.lineTo(x, y);
                        draw();
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                }
                return true;
            }
     }

    相关文章

      网友评论

          本文标题:SurfaceView小结

          本文链接:https://www.haomeiwen.com/subject/jdaomqtx.html