0

私はユーザーが指で線を引くためにこのコードを使用しています:

public class DrawingView extends View {

private Paint paint;
private Path path;

public DrawingView(Context context , AttributeSet attrs) {
    super(context, attrs);

    this.paint = new Paint();
    this.paint.setAntiAlias(true);
    this.paint.setColor(Color.BLACK);
    this.paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(5f);

    this.path = new Path();
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawPath(path, paint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float eventX = event.getX();
    float eventY = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            path.moveTo(eventX, eventY);
            return true;
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
            path.lineTo(eventX, eventY);
            break;
        default:
            return false;
    }

    // Schedules a repaint.
    invalidate();
    return true;
}

public void clear() {
    path.reset();
    invalidate();
}

public void setPaintColor(int color) {
    paint.setColor(color);
}

public int getCurrentPaintColor() {
    return paint.getColor();
}
}

setPaintColor()メソッドを使用して、ペイントの色を変更しています。しかし、色を変更すると、描画全体が変更されます(以前に描画した線も)。ペイントの色を変更して、以前の図面をそのままにしておくにはどうすればよいですか?新しいパスを作成しようとしましたが、前の描画が消えます。

4

3 に答える 3

2

線を引くのに役立つこのコードを使用する必要があります

 public class MainActivity extends Activity implements OnTouchListener  {
private float x;
private float y;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MyCustomPanel view = new MyCustomPanel(this);

    ViewGroup.LayoutParams params = 
                        new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT,
                                                   LayoutParams.FILL_PARENT);
    addContentView(view, params);
    view.setOnTouchListener(this);

}
private class MyCustomPanel extends View {

    public MyCustomPanel(Context context) {
        super(context);

    }
    @Override
    public void draw(Canvas canvas) {

        Paint paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(6);

        canvas.drawLine(10,10,50,50,paint);
        paint.setColor(Color.RED);

        canvas.drawLine(50, 50, 90, 10, paint);
        canvas.drawCircle(50, 50, 3, paint);

        canvas.drawCircle(x,y,3,paint);

    }
}
public boolean onTouch(View v, MotionEvent event) {
    x = event.getX();
    y = event.getY();

    v.invalidate();
    return true;
}

}

于 2012-11-26T12:45:26.910 に答える
2

これには、描画の色とパスの両方を格納する小さなデータ構造を作成する必要があります。以下に例を示します。

class PaintClass
{
    Path path;
    int Color;
    public int getColor() { return color; }
    public void setColor(int color){this.Color = color;}
    public int getPath() { return path; }
    public void setPath(Path path){this.path = path;}

    ...
    ...
    ...   
}

ここで、PaintClass のオブジェクトを持つ配列リストを維持します。

onDraw メソッドでこのように実装します

{    
    for(PaintClass item : yourArrayListOfPaintClassObjects)
    {
        //set Paint color like this
        setPaintColor(item.getPaintColor());
        canvas.drawPath(.....,paint);
    }
}

注: 新しい図面ごとに、新しく作成した PaintClass オブジェクトを arraylist に追加します...

于 2012-10-09T07:36:45.643 に答える
1

ロジックを使用して色を保存し、onDraw() メソッドにロードする必要があります。前に、positionX、positionY、color 属性を持つオブジェクト Point を作成したことがあります..:)

于 2012-10-09T07:17:06.207 に答える