【问题标题】:How to wait until the path is drawn on canvas in android?如何等到路径在android的画布上绘制?
【发布时间】:2014-10-01 21:17:50
【问题描述】:

我的列表中有不同的路径,我想一次在 Canvas 上绘制一个路径,但我正在执行一个 for 循环,并且在绘制一条路径时,另一条路径开始在 Canvas 上绘制。 我该怎么做才能停止 for 循环或等到绘制路径。 for 循环如下所示。

                   for ( i = 0; i < mPaths.size(); i++) {
                        SvgHelper.SvgPath svgPath = mPaths.get(i);
                        svgPath.paint.setAlpha(255);
                        canvas.drawPath(svgPath.path, svgPath.paint);                           
                    } 

onDraw(Canvas canvas) 方法代码。 mPaths 列表变量的大小为 24。 问题是一次要绘制一条路径,但是当我将其保持在 for 循环中时,所有 24 条路径都是同时绘制的。

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // Log.w("On draw", "Executing Ondraw");

        synchronized (mSvgLock) {

            canvas.save();

            canvas.translate(getPaddingLeft(), getPaddingTop()
                    - getPaddingBottom());

                canvas.save();

                canvas.translate(getPaddingLeft(), getPaddingTop()
                        - getPaddingBottom());

                for (i = 0; i < mPaths.size(); i++) {
                    //
                    Log.w("no of times", String.valueOf(i));
                    //
                    synchronized (Lock) {

                        SvgHelper.SvgPath svgPath = mPaths.get(i);
                        svgPath.paint.setAlpha(255);
                        canvas.drawPath(svgPath.path, svgPath.paint);
                    }

//                  break;
                }

                canvas.restore();

        }

        canvas.save();
        canvas.translate(0.0f, getHeight() - getPaddingBottom() - mRadius
                * 3.0f);
    }

【问题讨论】:

  • 如果我理解正确 - 你需要动画绘图,所以在绘图循环中你不应该使用 list.size() 但变量从 1 到 list.size() 并且变量在末尾增加onDraw 并使用 invalidate 任务调用 invalidate 或 postdelayed 方法
  • 对不起@curioushikhov,但你能解释一下你在说什么。因为我没有得到那个..
  • 多线程绘制路径?
  • 没有 onDraw() 方法运行 24 次绘制路径对象,直到它绘制的每个路径对象都没有遇到 path.close。
  • youtube.com/watch?v=-NxG3BE9QCg@MarcoAcierno 在这个视频中,所有路径都是同时绘制的

标签: android svg path android-canvas androidsvg


【解决方案1】:

您可以创建一个Object 用于锁定并将您的核心代码放在同步块中。

试试这个;

Object lock = new Object();
for ( i = 0; i < mPaths.size(); i++) {
    synchronized (lock) {
        SvgHelper.SvgPath svgPath = mPaths.get(i);
        svgPath.paint.setAlpha(255);
        canvas.drawPath(svgPath.path, svgPath.paint);
    }               
}

【讨论】:

  • 谢谢。我已经尝试过了,但它不起作用。其绘制相同。贴出我的 onDraw(Canvas canvas) 方法代码。
猜你喜欢
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2012-08-15
  • 2021-06-25
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
相关资源
最近更新 更多