3

ビューに異なる色で複数の線を描画し、Android でパスを元に戻し、やり直します。

ビットマップ ペイント オプションを使用します。各パスには固有の色がありますが、元に戻す、やり直しが機能しません。

bitmappaint の私のコードは次のとおりです。

public MyView(Context context, Object object) {
    super(context);
    setFocusable(true);
    setFocusableInTouchMode(true);

    mPath = new Path();
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setColor(0xFFFFFF00);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(3);

    mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
}

protected void onSizeChanged(int w, int h, int oldw, int oldh) 
{
    super.onSizeChanged(w, h, oldw, oldh);
}

protected void onDraw(Canvas canvas) 
{
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    for (Path p : paths)
    {
        canvas.drawPath(p, mPaint);
    }
    canvas.drawPath(mPath, mPaint);
}

public boolean onTouchEvent(MotionEvent event)
{
    float x = event.getX();
    float y = event.getY();
    int action = event.getAction();
    int action1=event.getAction();
    switch (event.getAction())
    {
    case MotionEvent.ACTION_DOWN:
        undonePaths.clear();
        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;
        startPoint = new PointF(event.getX(), event.getY());
        endPoint = new PointF();
        invalidate();
        //   isDrawing = true;
        break;
    case MotionEvent.ACTION_MOVE:
        float dx = Math.abs(x - mX);
        System.out.println("action move");
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)
        {
            //  currentDrawingPath.path.quadTo(mX,mY,(x + mX)/2, (y + mY)/2);
        }
        mX = x;
        mY = y;
        endPoint.x = event.getX();
        endPoint.y = event.getY();
        isDrawing = true;
        invalidate();
        break;
    case MotionEvent.ACTION_UP:
        mPath.lineTo(mX, mY);
        paths.add(mPath);
        mPath = new Path();
        //  mCanvas.drawPath(mPath, ppaint);
        endPoint.x = event.getX();
        endPoint.y = event.getY();
        isDrawing = false;
        invalidate();
        break;
    default:
        break;
    }       
}

![bitmappaint キャンバスの出力][1] [1]: http://i.stack.imgur.com/9aQvE.png

パスに青色を選択すると、ビットマップを使用せずに色の問題に直面しました。これは、以前のすべてのパスが青色に変更されることを意味します。

これが私のコードです

protected void onDraw(Canvas canvas) 
{
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    for (Path p : paths)
    {
        canvas.drawPath(p, mPaint);
    }
    canvas.drawPath(mPath, mPaint);
}

![キャンバス描画を使用したビットマップなしの出力][2] [2]: http://i.stack.imgur.com/eDp5Y.png

plsは、アンドロイドでユニークなパスの異なる色で複数のパスを描くのを手伝ってくれます. よろしくお願いします........

4

2 に答える 2

7

MotionEvent.ACTION_UP を処理するとき: 次のようなパスの描画に使用される色を保存する必要があります。

case MotionEvent.ACTION_UP:
    paths.add(mPath);
    colorsMap.put(mPath,selectedColor); // store the color of mPath
    ...

パスを描画する前に、ペイント カラーを設定する必要があります。

protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    for (Path p : paths)
    {
        mPaint.setColor(colorsMap.get(p));
        canvas.drawPath(p, mPaint);
    }
    mPaint.setColor(selectedColor);
    canvas.drawPath(mPath, mPaint);
}

そして、colorsMap は単純なインスタンス変数です。

private Map<Path, Integer> colorsMap = new HashMap<Path, Integer>();    

元に戻す/やり直し機能を実装するには、パスから最後の要素を削除するだけです (そして、やり直し時に元に戻せるようにそれを undoneList に格納します)。Android Canvas のやり直しと元に戻す操作を参照してください。

于 2012-12-06T09:10:06.433 に答える