0

以下のように WebView にキャンバスを作成しています。ユーザーがボタンをクリックして描画されたパスを削除できるように、元に戻す機能を実装しています。ただし、アクティビティを終了して戻った場合でも、キャンバスには常にパスが入力されています。それを削除する唯一の方法は、アプリを閉じることです。canvasBitmapビットマップまたはキャンバスを削除または再作成する方法drawCanvas

public static Canvas drawCanvas;
public static Bitmap canvasBitmap;
Rect clipBounds;

public static ArrayList<Path> paths = new ArrayList<Path>();
public static ArrayList<Paint> colors = new ArrayList<Paint>();

// Creates bitmap for canvas
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
}

// Saves the paths onto the bitmap and adjust scale based on current zoom level
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    clipBounds = canvas.getClipBounds();
    drawPaint.setStrokeWidth(8/mScaleFactor);
    canvas.scale(mScaleFactor, mScaleFactor, 0, 0);

    for (int i = 0; i < colors.size(); i++) {
        canvas.drawPath(paths.get(i), colors.get(i));
    }
    canvas.drawPath(drawPath, drawPaint);
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    invalidate();
}

public boolean onTouchEvent(MotionEvent event) {
    pointerCount = event.getPointerCount();
    mScaleDetector.onTouchEvent(event);
    float touchX = (event.getX() + clipBounds.left) / mScaleFactor;
    float touchY = (event.getY() + clipBounds.top) / mScaleFactor;
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_UP:
                 Paint newPaint = new Paint();
                newPaint.set(drawPaint); //copies the values over from the current class's paint
                colors.add(newPaint);
                paths.add(drawPath);
                drawPath = new Path();
                drawPath.reset();
                break;
            default:
                return false;
        }
    }
    invalidate();
    return true;
}

public void reDrawUndo () {
     if (paths.size() > 0) {
         paths.remove(paths.size() - 1);
         colors.remove(colors.size() - 1);
         invalidate();
     }
}

このメソッドを使用して、対応する色のパスをキャンバスに描画しています。

for (int j = 0; j < paths.size(); j++) {
    drawCanvas.drawPath(paths.get(j),colors.get(j));
           }
4

1 に答える 1

0

リスト「パス」に保持するすべてのポイントと、現在描画されているパス「drawPath」を保持します。これが「ロジック」です。

それらを画面に表示したい場合はonDraw(Canvas canvas)、提供されたキャンバスのメソッドで描画します。これは、UI に描画されるロジックです。

ポイントを節約したい場合、何を達成したいかによりますが、選択肢はほとんどありません。パスが描画されたビットマップを保存する場合は、新しいビットマップ (常にメモリに保持する必要はありません) とそのためのキャンバスを作成し、新しいキャンバスにすべてのポイントを描画します。後で描画できるようにポイントを保存する場合は、ファイルまたはデータベースに整数またはテキストとして保存します。

于 2013-11-06T16:04:38.383 に答える