zoukankan      html  css  js  c++  java
  • 双缓冲技术局部更新原理之派生自SurfaceView

    package com.loaderman.customviewdemo;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    
    public class RectRefreshSurfaceView extends SurfaceView {
        private Paint mPaint;
    
        public RectRefreshSurfaceView(Context context) {
            super(context);
            init();
        }
    
        public RectRefreshSurfaceView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public RectRefreshSurfaceView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }
    
        private void init() {
            mPaint = new Paint();
            mPaint.setColor(Color.argb(0x1F, 0xFF, 0xFF, 0xFF));
            mPaint.setTextSize(30);
    
            getHolder().addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    drawText(holder);
                }
    
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                }
    
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                }
            });
        }
    
        private void drawText(final SurfaceHolder holder) {
            new Thread(new Runnable() {
    
                @Override
                public void run() {
    
                    //先进行清屏操作
                    while (true) {
                        Rect dirtyRect = new Rect(0, 0, 1, 1);
                        Canvas canvas = holder.lockCanvas(dirtyRect);
                        Rect canvasRect = canvas.getClipBounds();
                        if (getWidth() == canvasRect.width() && getHeight() == canvasRect.height()) {
                            canvas.drawColor(Color.BLACK);
                            holder.unlockCanvasAndPost(canvas);
                        } else {
                            holder.unlockCanvasAndPost(canvas);
                            break;
                        }
                    }
    
                    //画图
                    for (int i = 0; i < 10; i++) {
                        //画大方
                        if (i == 0) {
                            Canvas canvas = holder.lockCanvas(new Rect(10, 10, 600, 600));
                            dumpCanvasRect(canvas);
                            canvas.drawColor(Color.RED);
                            holder.unlockCanvasAndPost(canvas);
                        }
    
                        //画中方
                        if (i == 1) {
                            Canvas canvas = holder.lockCanvas(new Rect(30, 30, 570, 570));
                            dumpCanvasRect(canvas);
                            canvas.drawColor(Color.GREEN);
                            holder.unlockCanvasAndPost(canvas);
                        }
    
                        //画小方
                        if (i == 2) {
                            Canvas canvas = holder.lockCanvas(new Rect(60, 60, 540, 540));
                            dumpCanvasRect(canvas);
                            canvas.drawColor(Color.BLUE);
                            holder.unlockCanvasAndPost(canvas);
                        }
    
                        //画圆形
                        if (i == 3) {
                            Canvas canvas = holder.lockCanvas(new Rect(200, 200, 400, 400));
                            dumpCanvasRect(canvas);
                            mPaint.setColor(Color.argb(0x3F, 0xFF, 0xFF, 0xFF));
                            canvas.drawCircle(300, 300, 100, mPaint);
                            holder.unlockCanvasAndPost(canvas);
                        }
                        //写字
                        if (i == 4) {
                            Canvas canvas = holder.lockCanvas(new Rect(250, 250, 350, 350));
                            dumpCanvasRect(canvas);
                            mPaint.setColor(Color.RED);
                            canvas.drawText(i + "", 300, 300, mPaint);
                            holder.unlockCanvasAndPost(canvas);
                        }
    
    
                        try {
                            Thread.sleep(800);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    
        private void dumpCanvasRect(Canvas canvas) {
            if (canvas != null) {
                Rect rect = canvas.getClipBounds();
                Log.d("loaderman", "left:" + rect.left + "  top:" + rect.top + "  right:" + rect.right + "  bottom:" + rect.bottom);
            }
        }
    }

    效果:

  • 相关阅读:
    选择适合自己的Markdown编辑器
    学习笔记
    读书笔记:Ajax/REST架构对于侵入式Web应用的优势
    scala学习之路(三)数组
    scala学习之路(二)控制结构和函数
    scala学习之路(一)基础
    Centos7下搭建Django+uWSGI+nginx基于python3
    java Date 和 数据库Date,DateTimed
    Java IO编程
    Hive内部表,外部表,分区表的创建
  • 原文地址:https://www.cnblogs.com/loaderman/p/10232191.html
Copyright © 2011-2022 走看看