清空画布 java_如何在清除SurfaceView画布后避免鬼图绘制

您好我正在使用SurfaceView绘制输入信号的实时图。 采样率为128Hz,目标图形刷新率为50Zh。如何在清除SurfaceView画布后避免鬼图绘制

事情办得相当顺利,该点被正确绘制实时的。

我使用Path() 为每个段调用path.computeBounds()得到一个矩形,我将用它来调用holder.lockCanvas(rect)并绘制路径。使用矩形防止闪烁,减少CPU的使用当图形达到予锁定整个画布和清除背景,绘制图形帧,然后继续绘制结束

的问题是,在每一个新的“页面”年初我从最后一页鬼形象:

0AAnH.png

我相信这是由双缓冲/使用脏区造成的绘图时。

我已经看过了这个问题,但没有解决方案,似乎足以满足这种类型的应用。任何帮助是最受欢迎的。

感谢 让 - 皮埃尔·

代码如下:

private void draw() {

Point point = null;

Canvas canvas = null;

Path path = new Path();

ArrayList pointArray;

float oldX = -1;

boolean setToClear = false;

boolean isNewSegment = false;

if (samplesInQueue == 0) {

return;

}

pointArray = new ArrayList((int) samplesInQueue);

for (int i = 0; i < samplesInQueue; i++) {

// take a peek at the point without retrieving it from the point

// queue

point = Points.peek();

// check if first point of segment is the start of a page

if (i == 0) {

if (lastSegmentEndPoint != null) {

if (point.x < lastSegmentEndPoint.x) {

// yes then we will need to clear the screen now

isNewSegment = true;

}

} else {

// yes then we will need to clear the screen now

isNewSegment = true;

}

}

if (point != null) {

if (point.x > oldX) {

// put consecutive points in the path point array

point = Points.poll();

samplesInQueue--;

pointArray.add(point);

oldX = point.x;

} else {

// we have a wrap around, stop and indicate we need to clear

// the screen on the next pass

if (!isNewSegment) {

setToClear = true;

}

break;

}

}

}

// no points, return

if (pointArray.size() == 0) {

return;

}

// fill the path

for (int i = 0; i < pointArray.size(); i++) {

Point p = pointArray.get(i);

if (i == 0) {

if (lastSegmentEndPoint != null) {

if (p.x >= lastSegmentEndPoint.x) {

// if we have the end of the last segment, move to it

// and line to the new point

path.moveTo(lastSegmentEndPoint.x, lastSegmentEndPoint.y);

path.lineTo(p.x, p.y);

} else {

// otherwise just line to the new point

path.moveTo(p.x, p.y);

}

} else {

path.moveTo(p.x, p.y);

}

} else {

path.lineTo(p.x, p.y);

}

}

if (clear || isNewSegment) {

if (clear) {

clear = false;

}

// we need to clear, lock the whole canvas

canvas = holder.lockCanvas();

// draw the graph frame/scales

drawGraphFrame = true;

drawGraphFrame(canvas);

} else {

// just draw the path

RectF bounds = new RectF();

Rect dirty = new Rect();

// calculate path bounds

path.computeBounds(bounds, true);

int extra = 0;

dirty.left = (int) java.lang.Math.floor(bounds.left - extra);

dirty.top = (int) java.lang.Math.floor(bounds.top - extra);

dirty.right = (int) java.lang.Math.round(bounds.right + 0.5);

dirty.bottom = (int) java.lang.Math.round(bounds.bottom + 0.5);

// just lock what is needed to plot the path

canvas = holder.lockCanvas(dirty);

}

// draw the path

canvas.drawPath(path, linePaint);

// unlock the canvas

holder.unlockCanvasAndPost(canvas);

// remember last segment end point

lastSegmentEndPoint = pointArray.get(pointArray.size() - 1);

// set clear flag for next pass

if (setToClear) {

clear = true;

}

}

绘制帧/清除图形代码

private void drawGraphFrame(Canvas canvas) {

if (!drawGraphFrame) {

return;

}

if (canvas == null) {

Log.e(TAG, "trying to draw on a null canvas");

return;

}

drawGraphFrame = false;

// clear the graph

canvas.drawColor(Color.BLACK, Mode.CLEAR);

// draw the graph frame

canvas.drawLine(leftMargin, topMargin, leftMargin, mCanvasHeight - bottomMargin, framePaint);

canvas.drawLine(leftMargin, mCanvasHeight - bottomMargin, mCanvasWidth - rightMargin, mCanvasHeight

- bottomMargin, framePaint);

// more drawing

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值