双缓冲技术局部更新原理之派生自SurfaceView
2024-09-01 09:59:44
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);
}
}
}
效果:
最新文章
- 10大白帽黑客专用的 Linux 操作系统
- cocopods 知识集合 及 一个 好的 国外iOS技术翻译站
- sencha touch api 使用指南
- codevs 1220 数字三角形
- 【笔记】让DIV水平垂直居中的两种方法
- R语言分析(一)-----基本语法
- Linux帮助手册(man)
- 【RL-TCPnet网络教程】第20章 RL-TCPnet之BSD Socket客户端
- Token令牌管理权限
- java连接服务器语法
- EF Core 生成数据库
- 简单易懂的程序语言入门小册子(5):基于文本替换的解释器,递归,不动点,fix表达式,letrec表达式
- CSS实现水平居中的5种思路
- ARM交叉编译工具链
- 使用jsonp进行跨站点数据访问
- (二)this、call和apply
- uwp获取版本信息win10 VersionInfo
- 理解 atime,ctime,mtime (上)
- HADOOP docker(九):hdfs权限
- linux命令(13):kill/killall命令