Android画布多次绘制会导致闪烁
有关此主题的关键字:Android画布多次绘制会导致闪烁,android,android-canvas,surfaceview,flicker,Android,Android Canvas,Surfaceview,Flicker,有关此主题的关键字: CustomSurfaceView:三个不同级别的三个自定义surfaceview Canvas:lock/unlockAndPost方法(我没有使用自定义位图) 多螺纹(每个表面都是单独的螺纹) 形状(画布上的形状) 客户机/服务器(体系结构) 闪烁(这就是我在这里的原因) 我们正在开发一个客户端/服务器应用程序,我正在客户端工作。我从服务器接收到消息,其中包含有关路径(如圆、矩形、直线和其他形状)的常规数据(坐标、颜色、宽度[…])。web应用程序允许用户将这些在HTM
@Override
public void run() {
Canvas canvas = null;
while (running) {
//this is the surface's canvas
try {
canvas = shapesSurfaceHolder.lockCanvas();
synchronized (shapesSurfaceHolder) {
if (shapesSurfaceHolder.getSurface().isValid()) {
if(!Parser.cmdClear){
//draw all the data present
canvas.drawPath(PencilData.getInstance().getPencilPath(),
PencilData.getInstance().getPaint());
canvas.drawPath(RectData.getInstance().getRectPath(),
RectData.getInstance().getPaint());
canvas.drawPath(CircleData.getInstance().getCirclePath(),
CircleData.getInstance().getPaint());
canvas.drawPath(LineData.getInstance().getLinePath(),
LineData.getInstance().getPaint());
canvas.drawText(TextData.getInstance().getText(),
TextData.getInstance().getX(),
TextData.getInstance().getY(),
TextData.getInstance().getPaint());
} else {
//remove all canvas content and clear data.
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for (int i = 0; i < AbstractFactory.SHAPE_NUM; i++) {
abstracFactory.getShape(i).clearData();
}
}
}
}
} finally {
if (canvas != null) {
shapesSurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}//end_run()
@覆盖
公开募捐{
Canvas=null;
(跑步时){
//这是曲面的画布
试一试{
canvas=shapeSurfaceHolder.lockCanvas();
同步(ShapeSurfaceHolder){
如果(ShapeSurfaceHolder.getSurface().isValid()){
如果(!Parser.cmdClear){
//绘制当前的所有数据
canvas.drawPath(PencilData.getInstance().getPencilPath(),
PencilData.getInstance().getPaint());
canvas.drawPath(RectData.getInstance().getRectPath(),
RectData.getInstance().getPaint());
canvas.drawPath(CircleData.getInstance().getCirclePath(),
CircleData.getInstance().getPaint());
canvas.drawPath(LineData.getInstance().getLinePath(),
LineData.getInstance().getPaint());
canvas.drawText(TextData.getInstance().getText(),
TextData.getInstance().getX(),
TextData.getInstance().getY(),
TextData.getInstance().getPaint());
}否则{
//删除所有画布内容并清除数据。
canvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
for(int i=0;i
我可以总结一下,显然,我的问题是画得太快
注意:
类似的概念:
硬件加速已启用
第17版
测试
- 平板电脑三星SM-T113
- 谷歌Nexus5
- TextureView问题是由于TextureView特有的错误造成的。您使用的是SurfaceView,因此此处不适用
在SurfaceView的曲面上绘制时,必须每次更新脏矩形内的每个像素(即传递给
lockCanvas()
)的可选参数)。如果不提供脏rect,则意味着必须更新整个屏幕。这是因为曲面是双缓冲或三缓冲的,并且在调用unlockCanvasAndPost()
时交换。如果锁定/清除/解锁,则下次锁定/绘制/解锁时,将不会绘制到先前清除的缓冲区中
如果要进行增量渲染,应将画布指向屏幕外位图,并在那里进行所有渲染。然后在锁定和解锁之间切换整个位图。另一种方法是存储图形命令,从初始的“清除”开始,然后在“锁定/解锁”之间播放它们
“三个自定义surfaceview”一词在某种程度上会让人担心它们是否同时出现在屏幕上。如果它们都位于不同的Z深度(默认值、媒体覆盖、顶部),则它们将正常工作,但如果可以将所有内容放在一个位置上,系统通常会更高效。