8

私はこの問題をグーグルで検索し、さまざまな解決策を提案しました。
しかし、どれも私にとってはうまくいきませんでした。

アプリに描画キャンバスがあります。
キャンバスの背景は、カスタム ビュー (drawView) を使用するアクティビティの png 画像に設定されます。

Bundle extras = intent.getExtras();
    if (extras != null) {
        if (extras.containsKey("background")) {

            //set the background to the resource in the extras
            int imageResource = intent.getIntExtra("background",-1);
            Drawable image = getResources().getDrawable(imageResource);
            drawView.setBackground(image);
        }
    }

DrawingView クラス (drawview はインスタンス) では、描画されたパスを PathPaints のコレクションに格納します。これには 3 つのプロパティ (パス、使用されるペイント、消しゴムの場合) があります。

private ArrayList<PathPaint> paths = new ArrayList<PathPaint>();

次に、OnDraw でこれらのパスをループして、描画に使用したペイント (複数の色) で毎回再描画しようとします。

protected void onDraw(Canvas canvas) {

    //if the drawing is new - dont draw any paths
    if (isNew != true) {

        //go through every previous path and draw them
        for (PathPaint p : paths) {

            if (!p.isErase)
            {
                canvas.drawPath(p.myPath, p.myPaint);
            }
            else
            {
                //Paint eraserPaint = setDefaultPaint();
                //eraserPaint.setAlpha(0xFF);
                //eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                //eraserPaint.setColor(Color.TRANSPARENT);
                //canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
                canvas.drawPath(p.myPath, p.myPaint);
            }
            canvas.drawBitmap(canvasBitmap, 0, 0, null);

        }
    }

提案された多くのオプションをオンラインで試しましたが、役に立ちませんでした。

ドローパスにペイントを設定して、コメントアウトされたさまざまなプロパティをすべて設定しようとしました。

ビットマップに描画してから、そのビットマップをキャンバスにロードしようとしました(canvas.drawBitmap(canvasBitmap、0、0、null))

このクラスのコンストラクターでハードウェア アクセラレーションをオフにしました

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

ただし、線が描画されていないか、コレクションがパスを再描画しているときに、消しゴムが黒い線を描画します。

ここに画像の説明を入力

興味深いのは、ループ アスペクトなしでビットマップを使用して消去を実行すると、消しゴムが期待どおりに機能することです。

//If we are making a new drawing we don't want to go through all the paths
    if (isNew != true && erase ==false) {

        //go through every previous path and draw them


        for (PathPaint p : paths) {

            if (!p.isErase)
            {
                canvas.drawPath(p.myPath, p.myPaint);
            }
            //this section now takes place in the elseIF
            else
            {
                Paint eraserPaint = setDefaultPaint();
                eraserPaint.setAlpha(0xFF);
                eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                eraserPaint.setColor(Color.TRANSPARENT);


                canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
                canvas.drawPath(p.myPath, p.myPaint);
            }
        }
    }
    else if (isNew != true && erase ==true)
    {   
        //This works correctly for Erasing but I dont have the ability to Undo/Redo with this approach! 
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);

    }

ただし、これは問題です。元に戻す/やり直しを実行できるようにしたいからです (したがって、コレクションのポイント)。

誰でも私を助けてもらえますか?

4

3 に答える 3

0

キャンバスのビットマップを確認してください。Config.ARGB8888 ですか?

この回答も確認してくださいAndroid canvas: draw transparent circle on image

あなたの drawView は ImageView だと思いますよね?

于 2016-06-07T02:54:45.320 に答える