当前位置: 首页 > 知识库问答 >
问题:

只在位图画布的选定区域绘制路径

时旭东
2023-03-14

所以我目前正在建立儿童涂色书应用程序。我想限制绘制区域,这样它只能在选定的区域绘制路径。例如,如果我触摸了喇叭,那么绘制区域只是喇叭边框内的空间。目前,我只能在位图中绘制路径(绘制区域不受限制)。

第一张图片:触摸区域。

第二张图片:用户只能在蓝色空间内绘制路径。

    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmapCanvas, 0f, 0f, paintCanvas);
        canvas.drawPath(mPaths, drawPaint);
    }
@Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        float x = motionEvent.getX();
        float y = motionEvent.getY();
        if (isEditable){
            switch (motionEvent.getAction()) {
                case 0:
                    if (paths.isEmpty()) {
                        mBitmap = Bitmap.createBitmap(mBitmapCanvas);
                        paths.add(mBitmap);
                    }
                    mPaths.reset();
                    setColor(ShaderInt);
                    mPaths.moveTo(x, y);
                    mX = x;
                    mY = y;
                    invalidate();
                    break;
                case 1:
                    mPaths.lineTo(mX, mY);
                    mCanvas.drawPath(mPaths, drawPaint);
                    mCanvas.drawPath(mPaths, drawPaint);
                    mBitmap = Bitmap.createBitmap(mBitmapCanvas);
                    paths.add(mBitmap);
                    mPaths.reset();
                    invalidate();
                    break;
                case 2:
                    float abs = Math.abs(x - this.mX);
                    float abs2 = Math.abs(y - this.mY);
                    if (abs >= TOUCH_TOLERANCE || abs2 >= TOUCH_TOLERANCE) {
                        this.mPaths.quadTo(this.mX, this.mY, (this.mX + x) / 2.0f, (this.mY + y) / 2.0f);
                        this.mX = x;
                        this.mY = y;
                    }
                    invalidate();
                    break;
                default:
                    return false;
            }

        } else {
            return false;
        }
        invalidate();
        return true;
    }

有没有什么办法让我可以使绘制区域限制在触摸/选定的区域?如有任何帮助,不胜感激,谢谢!

共有1个答案

锺超英
2023-03-14

我建议创建一个初始化为horn形状的路径,并使用Porter Duff操作来合成所需的结果。对您的用例感兴趣的Porter Duff操作可能是dst_in。

为了达到您想要的效果,代码非常简单。在onDraw(画布)回调中,您要做的第一件事是使用具有PorterDuffXfermode集的paint对象绘制自定义的“horn”路径,模式设置为DST_IN。所有随后的调用都将被屏蔽到您的“喇叭”路径的边界。接下来,像往常一样在画布上执行自定义绘图逻辑。

要在“horn”路径之外执行绘制,只需从paint对象中移除Porter Duff xfermode,然后像往常一样继续绘制。我建议您查看PortDuff文档,并非常熟悉绘制代码的顺序,以确保您得到预期的结果,并理解为什么最终结果可能与您预期的不同。当使用波特达夫合成时,你在你的来源之前画出你的目的地;一开始可能说不通。

这里有一个链接,指向一个限制在“圆”路径内绘制位图的示例。

 类似资料:
  • 我正在运行Ubuntu 16.04。在Android Studio上,当我试图在模拟器中运行我的应用程序时,我得到以下错误: 致命的例外:主要过程:项目名称在这里,PID: 2528java.lang.运行时间例外:画布:试图绘制太大(216090000bytes)位图。在android.view.DisplayListCanvas.throw如果不能绘制(DisplayListCanvas.ja

  • 我想在HTML5画布/或SVG上执行以下操作: 有一个背景路径,将光标移过去并绘制(填充)背景路径 用户完成绘图后有回调函数 我的问题是,我不知道如何检查抽屉线是否遵循路径。 有人能给我解释一下如何做到这一点,或者给我一些建议吗? http://jsbin.com/reguyuxawo/edit?html,js,控制台,输出

  • 我试图使用矩阵旋转位图。然后我试着把它画在画布上。但它就这么消失了! 下面是我的代码: } 我已经删除了缩放画布和事件监听器等的函数。使代码小而易读。 我周期性地调用setDirection方法,但是在它被调用之后,“userImage”drawable就消失了。有人能告诉我这里出了什么问题吗。。 谢谢

  • 我是Android新手,发现了很多东西。但现在我很沮丧。我想做一个六角形棋盘游戏,用瓷砖。我找到了很多芭蕾舞团,最后决定画出我想要的六边形。 我创建了一个从视图扩展的“Hex”类,添加了一些变量等等。以下是我在主XML布局中的内容: r=大小,x和y是画布上的偏移。以下是我在活动中看到的内容:主活动屏幕 但现在我想选择单十六进制。例如,我想选择左上角的,或右下角的。我在每个视图上都添加了OnCli

  • 我编写了这段代码,可以在JavaFX画布上绘制。它可以很好地工作,但我不知道如何重新绘制画布(比如在Swing中),以便在新画布上重新开始绘制。这是我的代码,非常感谢你的帮助!马里奥

  • 我正在做一个国际象棋应用程序,当我绘制棋盘的瓷砖时,它们在(透明)背景中不会变色。基本上,我想要的是,它类似于在ImageView中发生的事情,该图像视图显示具有彩色背景的图像(具有透明背景)。 这是代码 这就是棋盘的样子(左图) 如果我在之前注释掉这2行,我就会得到正确的图像。 我的作品是带有透明背景的普通图像,作品没有画在正方形中。我怎么能有作品背后的红色呢?(就像带有背景色的相同图像的Ima