簡體   English   中英

僅在位圖畫布android java的選定區域中繪制路徑

[英]Draw path only in selected area of bitmap canvas android java

所以我目前正在構建兒童圖畫書應用程序。 我想限制繪圖區域,因此它只能在選定區域中繪制路徑。 例如,如果我觸摸喇叭,那么繪制區域只是喇叭邊界內的空間。 目前,我只能在位圖中繪制路徑(繪制區域不受限制)。

觸摸區域 我只能用藍色繪制路徑

第一張圖:觸摸區域。

第二張圖:用戶只能在藍色空間內繪制路徑。

現在,這是我的 onDraw 代碼:

    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;
    }

有什么辦法可以使繪圖區域限制在觸摸/選定區域? 任何幫助將不勝感激,謝謝!

我建議創建一個初始化為您的喇叭形狀的路徑,並使用Porter Duff操作來合成所需的結果。 您的用例感興趣的 Porter Duff 操作可能是DST_IN

為了達到你想要的效果,代碼非常簡單。 onDraw(Canvas)回調中,您要做的第一件事是使用具有PorterDuffXfermode設置的繪制對象繪制自定義“喇叭”路徑,並將DST_IN設置為其模式。 所有后續調用都將被屏蔽到您的“喇叭”路徑的邊界。 接下來,像往常一樣在畫布上執行自定義繪圖邏輯。

要在“喇叭”路徑之外執行繪圖,只需從繪圖對象中移除 Porter Duff xfermode 並像往常一樣繼續繪圖。 我建議您查看 PortDuff 文檔並熟悉繪制代碼的順序,以確保您獲得預期結果並了解為什么最終結果可能與您預期的不同。 使用 Porter Duff 合成時,您在源之前繪制目的地; 起初可能沒有意義。

如果您手動繪制背景圖像(山羊),您可能需要特別小心以確保它完全繪制,而不僅僅是“喇叭”路徑內包含的部分。 如果你讓 View 框架繪制背景,即使用 set setBackround(Drawable)你應該很好。

這是限制在“圓形”路徑內繪制位圖的示例的鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM