4

我正在尝试在 Android 中实现绘图应用程序。用户应该能够选择和移动绘制的形状。
目前我已经在我的绘图画布上静态绘制了一些矩形和文本:

        View mDrawingCanvas = new View(mContext) 
        {
            ShapeDrawable rectangle;
            @Override
            public boolean isFocused() {
                // TODO Auto-generated method stub
                Log.d(TAG, "View's On focused is called !");
                return super.isFocused();
            }

            @Override
            public boolean onTouchEvent(MotionEvent event) {
                // TODO Auto-generated method stub

                return super.onTouchEvent(event);
            }

            @Override
            protected void onDraw(final Canvas canvas) {
                super.onDraw(canvas);
                // Work out current total scale factor
                // from source to view

                final float scale = mSourceScale*(float)getWidth()/(float)mSize.x;

                Paint paint = new Paint();
                paint.setStyle(Paint.Style.FILL);
                paint.setColor(Color.WHITE);

                //Custom View
                rectangle = new ShapeDrawable(new RectShape());
                rectangle.getPaint().setColor(Color.GRAY);
                rectangle.getPaint().setStyle(Paint.Style.FILL_AND_STROKE);
                rectangle.getPaint().setStrokeWidth(3);
                rectangle.setBounds((int)(50*scale), (int)(30*scale), (int)(200*scale), (int)(150*scale));
                rectangle.draw(canvas);

                rectangle.getPaint().setColor(Color.BLUE);
                rectangle.getPaint().setStyle(Paint.Style.FILL_AND_STROKE);
                rectangle.getPaint().setStrokeWidth(3);
                rectangle.setBounds((int)(200*scale), (int)(200*scale), (int)(400*scale), (int)(350*scale));
                rectangle.draw(canvas);
            }
        };

我想选择(在所选形状上绘制边框)并在绘图画布的 onTouch 事件中移动绘制的形状。
有人可以指导我吗,非常感谢任何帮助。

4

2 回答 2

3

这个答案已经证明了我正在寻找的形状移动方法。
我的问题现在解决了。链接是:
拖动并移动画布上绘制的圆圈

于 2013-10-22T01:58:52.517 回答
1

您应该在触摸事件中保存 X 和 Y 位置,并在绘制形状时使用它们。下面是一个非常基本的示例,说明如何执行此操作,但您需要对其进行改进(检查触摸是否在对象内部并且仅更改该对象的值)

例子:

public class DrawTest extends View {

    private static final String TAG = "Desenho";

    private ShapeDrawable rectangle;
    private Paint paint;
    private float currX, currY;
    private Rect blue, gray;

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

        currX = 1;
        currY = 1;

        gray = new Rect(50,30,200,150);
        blue = new Rect(200,200,400,350);

        paint = new Paint();
        rectangle = new ShapeDrawable(new RectShape());
    }

    @Override
    public boolean isFocused() {
        Log.d(TAG, "View's On focused is called !");
        return super.isFocused();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        currX = event.getX();
        currY = event.getY();
        invalidate();
        Log.d(TAG, "View's On touch is called! X= "+currX + ", Y= "+currY);
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(final Canvas canvas) {
        super.onDraw(canvas);

        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.WHITE);

        //Custom View
        rectangle.getPaint().setColor(Color.GRAY);
        rectangle.getPaint().setStyle(Paint.Style.FILL_AND_STROKE);
        rectangle.getPaint().setStrokeWidth(3);
        gray.set((int)(50+currX), (int)(30+currY), (int)(200+currX), (int)(150+currY));
        rectangle.setBounds(gray);
        gray = rectangle.getBounds();
        rectangle.draw(canvas);

        rectangle.getPaint().setColor(Color.BLUE);
        rectangle.getPaint().setStyle(Paint.Style.FILL_AND_STROKE);
        rectangle.getPaint().setStrokeWidth(3);
        blue.set((int)(200+currX), (int)(200+currY), (int)(400+currX), (int)(350+currY));
        rectangle.setBounds(blue);
        blue = rectangle.getBounds();
        rectangle.draw(canvas);

    }

}
于 2013-10-21T09:43:04.717 回答