如何在java中为android绘制一个矩形?

时间:2014-11-10 15:30:20

标签: java android canvas

我正在尝试做一个非常简单的绘图程序,你可以通过在屏幕上移动手指来绘制线条,现在我想让程序绘制一个矩形。我想创建两个菜单项,确定我当前绘制的内容。当程序启动时,它应该允许我自由绘制,但是当我单击第二个菜单按钮时,我应该能够绘制一个矩形。通过这个,我的意思是当我拖动我的手指时,程序从起点绘制一个矩形到我的手指被拖动的点。在拖动/绘制时,它应始终显示矩形。

CanvasView.java

    package com.example.androiddrawing;
    import java.util.ArrayList;
    import java.util.List;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.graphics.Point;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;

    public class CanvasView extends View {

        private Paint paint = new Paint();
        private Paint paint2 = new Paint();
        private Path path = new Path();
        private Point point = new Point(); 
        private static List<Path> lines = new ArrayList<Path>();
        private static List<Point> points = new ArrayList<Point>();
        private float x;
        private float y;
        private boolean touchStarted = false;

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

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

                paint2.setAntiAlias(true);
                paint2.setStrokeWidth(5);
                paint2.setColor(Color.RED);
                paint2.setStyle(Paint.Style.STROKE);
                paint2.setStrokeJoin(Paint.Join.ROUND);

        }

        @Override
        protected void onDraw(Canvas canvas) {
                for (Path p: lines)
                        canvas.drawPath(p, paint);
                canvas.drawPath(path, paint2);

                for (Point point: points)
                    canvas.drawCircle(point.x, point.y, 1 , paint);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
                x = event.getX();
                y = event.getY();

                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    // Set a new starting point
                    paint2.setColor(Color.RED);
                    path = new Path();
                    path.moveTo(x, y);
                    touchStarted = true;
                    break;
                    //return true;
                case MotionEvent.ACTION_MOVE:
                    // Connect the points
                    touchStarted = false;
                    path.lineTo(x, y);
                    break;
                case MotionEvent.ACTION_UP:
                    if(touchStarted){
                        point = new Point();
                        point.x =(int) x;
                        point.y = (int) y;
                        paint2.setColor(Color.BLACK);
                        points.add(point);
                        touchStarted = false;
                        System.out.println("siin");
                    } else {
                    System.out.println("seal");
                    paint2.setColor(Color.BLACK);
                    lines.add(path);
                    }
                    break;
                default:
                    return false;
            }

            // Makes our view repaint and call onDraw
            invalidate();
            return true;
        }

    }

这是按下菜单项时的代码

MainActivity.java
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.default_drawing) {
            drawMode = 1;
            return true;
        } else if (id == R.id.draw_rectangle) {
            drawMode = 2;
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

我有这个代码,这允许我自由绘制。但我不知道,当我点击另一个菜单项时,如何更改正在绘制的内容。希望你理解我的问题:)

编辑: 让这个菜单选择工作正常,现在如果有人可以教我如何画一个矩形,会很棒;)

1 个答案:

答案 0 :(得分:0)

<>在CanvasView中,创建一个公共枚举DrawMode {FreeDrawMode,RectDrawMode};

然后创建一个私有的DrawMode currentDrawMode;

然后是一个setter方法:

public void setDrawMode(DrawMode newDrawMode) {
    this.currentDrawMode = newDrawMode;
}

然后,在您的MainActivity中,当用户单击菜单项以更改绘制模式时,只需传入用户选择的CanvasView.DrawMode设置。

请注意,在CanvasView类中创建公共枚举DrawMode将要求您从CanvasView.java类之外的任何位置将其引用为“CanvasView.DrawMode.FreeDrawMode”而不是“DrawMode.FreeDrawMode”。