gpt4 book ai didi

android - 在 Canvas 上绘制路径,当触摸输入快速移动并停止时,最后一段持续闪烁

转载 作者:行者123 更新时间:2023-11-29 14:05:57 26 4
gpt4 key购买 nike

我正在开发一个绘图应用程序。它相当简单,使用 onTouchEvent、paths 和 canvas.drawPath。每当用户快速滑动并不停地释放时,路径的最后一段会持续闪烁。在 ACTION_UP 条件下,我更新路径并将 bool resetPath 设置为 true,在 onDraw 中,我绘制路径,如果 resetPath 为真,我调用 path.reset() 然后将 resetPath 设置为 false。我做错了什么?

    class DrawingPanel extends SurfaceView implements SurfaceHolder.Callback {
private DrawingThread _thread;
private Path path;
private Boolean resetPath = false;

public DrawingPanel(Context context) {
super(context);
getHolder().addCallback(this);
_thread = new DrawingThread(getHolder(), this);
path = new Path();
}


private float mX, mY;
private static final float TOUCH_TOLERANCE = 25;



public boolean onTouchEvent(MotionEvent event) {

synchronized (_thread.getSurfaceHolder()) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
path.reset();
path = new Path();
path.moveTo(event.getX(), event.getY());
mX = event.getX();
mY = event.getY();
}else if(event.getAction() == MotionEvent.ACTION_MOVE){
float dx = Math.abs(event.getX() - mX);
float dy = Math.abs(event.getY() - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
path.quadTo(mX, mY, (event.getX() + mX)/2, (event.getY() + mY)/2);
mX = event.getX();
mY = event.getY();
}
}else if(event.getAction() == MotionEvent.ACTION_UP){
resetPath = true;
}
return true;
}
}

@Override
public void onDraw(Canvas canvas) {
canvas.drawPath(path, mPaint);
if (resetPath) {
path.reset();
resetPath = false;
}
}

最佳答案

考虑以下问题

  1. onDraw 中,您在绘制路径之前不会绘制或重置整个 Canvas 。通常,你应该。如果不是,它总是在前一个位图的顶部绘制路径。如果您的绘画使用透明度,则由于重叠,您绘制的路径中最旧的部分将不如最新的部分透明。
  2. OnTouchEventonDraw 不在同一个线程上运行。
  3. SurfaceView 使用透明的双缓冲技术。对 onDraw 的两次连续调用将绘制到两个不同的 Canvas 上。因此,如果在对 onDraw 的两次调用之间有一个 ACTION_MOVEACTION_UP,则第二个缓冲区将比第一个缓冲区有更多的绘图。这就是为什么你有眨眼效果。

解决方案

resetPath 更改为整数,这样您就可以在重置路径之前绘制两次路径。

private int resetPath = 0;

...else if(event.getAction() == MotionEvent.ACTION_UP){
resetPath = 2;
}...

public void onDraw(Canvas canvas) {
canvas.drawPath(path, mPaint);
if (resetPath == 1) {
path.reset();
resetPath = 0;
} else if(resetPath == 2) {
resetPath = 1
}
}

关于android - 在 Canvas 上绘制路径,当触摸输入快速移动并停止时,最后一段持续闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6995081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com