双缓冲技术局部更新原理之派生自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);
}
}
}
效果:

双缓冲技术局部更新原理之派生自SurfaceView的更多相关文章
- 双缓冲技术局部更新原理之派生自View
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...
- java的双缓冲技术
Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色.在Java游戏编程和动画编程中最常见的就是对于屏幕闪烁的处理.本文从J2SE的一个再现了屏幕闪烁的Java Appilication简单 ...
- VC 绘图,使用双缓冲技术实现
VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 ...
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...
- Win32 GDI 非矩形区域剪裁,双缓冲技术
传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X- ...
- avalon与双缓冲技术
avalon与双缓冲技术 avalon1.5一个重要技术升级是引进异步渲染.异步渲染在游戏界有一个更专业的名字,叫双缓冲.游戏界要刷新界面与我们刷新浏览器视图,面临的问题是一致的.视图是由许多存在套嵌 ...
- C# GDI+双缓冲技术
我想有很多搞图形方面的朋友都会用到双缓冲技术的时候,而且有的时候她的确是个头疼的问题.最近我也要用双缓冲技术,程序怎么调试都不合适,当要对图形进行移动时,总是会出现闪烁抖动.在网上找了些资料,说得都不 ...
- Android开发之用双缓冲技术绘图
双缓冲技术主要用在画图,动画效果上,其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去. 双缓冲技术可以有效防止闪烁,提高显示质量. DrawView.java: package ...
- OpenGL中实现双缓冲技术
在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | G ...
随机推荐
- 使用框架时,在web.xml中配置servlet时,拦截请求/和/*的区别。
关于servlet的拦截设置,之前看了好多,说的都不太清除,明白. 最近明白了一些,总的来说就是保证拦截所有用户请求的同时,放行静态资源. 现整理如下: 一.我们都知道在基于Spring的Applic ...
- Guava【google】
Guava 是什么? Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库.这个库是为了方便编码,并减少编码错误.这个库提供用于集合,缓存,支持原语,并发性,常见注解, ...
- Linux中条件语句
Linux中备份一个jar包,需要既判断进程是否停止,又判断文件是否存在 1. 进程停了,文件存在则备份 2.进程停了,文件不存在,无需备份 3. 进程在跑,停止进程:文件存在,将文件进行备份 4. ...
- WinForm DevExpress使用之ChartControl控件绘制图表一——基础
最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...
- LightOJ-1010-Knights in Chessboard(数学)
链接: https://vjudge.net/problem/LightOJ-1010 题意: Given an m x n chessboard where you want to place ch ...
- git忽略.idea文件
只需要在.gitignore文件增加.idea如果你已经推送到远程仓库,那需要执行git rm -r --cached .idea去掉已经托管的文件
- LeetCode 294. Flip Game II
原题链接在这里:https://leetcode.com/problems/flip-game-ii/ 题目: You are playing the following Flip Game with ...
- 学到了林海峰,武沛齐讲的Day18-4 文件操作
print(data.decode('utf-8')) 转换utf-8格式f.write('杨件'.encode('utf-8')) 转换为bytes# f.write(bytes('1111\n', ...
- Neo4j数据进行备份、还原
一.neo4j备份方式 neo4j数据库的备份还原分为两种: offline 和 online. Offline backup - dump Dump a database into a single ...
- Java超大文件上传解决办法
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...