使用多个路径和绘制对象时,Android Canvas 会被清理

标签 android canvas path ondraw

谁能解释一下为什么这段代码没有绘制出所有的对象?

public class A extends View {
private Paint paint = new Paint();
private Path path = new Path();
ArrayList<Pair<Path, Paint>> paths = new ArrayList<Pair<Path, Paint>>();


public A(Context context) {
    super(context);
}

@Override
protected void onDraw(Canvas canvas) {
    for (Pair<Path, Paint> p : paths) {
        canvas.drawPath(p.first, p.second);
    }
    canvas.drawPath(path, paint);
}



@Override
public boolean onTouchEvent(MotionEvent event) {
    float eventX = event.getX();
    float eventY = event.getY();
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(3f);

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            int color = Color.rgb(new Random().nextInt(255),
                                new Random().nextInt(255), 
                                new Random().nextInt(255));
            paint.setColor(color);
            path.reset(); //new stroke, get old one erased
            int historySize = event.getHistorySize();
            for (int i = 0; i > historySize; i++) {
                path.moveTo(eventX, eventY);
            }
             path.moveTo(eventX, eventY);

            return true;
        case MotionEvent.ACTION_MOVE:
            path.lineTo(eventX, eventY);
            return true;
        case MotionEvent.ACTION_UP:
            path.lineTo(eventX, eventY);
            // End of stroke, add this to the collection
            paths.add(new Pair<Path, Paint>(path, paint));
            break;
        default:
            break;
    }
    // Schedules a repaint.
    invalidate();
    return true;
}

我用 onTouchEvent 捕捉每一个笔画,我创建了不同的路径/绘画对象,存储在一对对象中。可悲的是,在我的 OnDraw 中,当我尝试将它们全部绘制时失败了.. 我已经阅读了一些主题但没有找到正确答案。每次有人建议在位图中创建和工作并将其绘制到屏幕上,但我想避免这种解决方案。

谢谢你的帮助!

最佳答案

问题是您总是使用相同的 PathPaint 对象。每次触发 MotionEvent.ACTION_DOWN 时,您都应该创建新的 PathPaint

关于使用多个路径和绘制对象时,Android Canvas 会被清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15320386/

相关文章:

android - 屏幕外的 Leadbolt 横幅

android - 我可以在我创建的 "frame"内启动一个新应用程序吗?

javascript - Canvas 到数据 url 无法正常工作

php - 在php中包含文件

android - adb 在 Windows 上未被识别为内部或外部命令

android - 更改 ShareActionProvider View 的背景

android - ConstraintLayout 中的边距如何工作?

Facebook 应用程序 - 无 SSL

javascript - 绘制到 Canvas 或用作图像源时缺少 SVG 图像和图案

Emacs 口齿不清 : Get directory name (not path) from the path