簡體   English   中英

如何在Java for Android中繪制矩形?

[英]How to draw a rectangle in java for android?

我正在嘗試做一個非常簡單的繪圖程序,您可以在屏幕上移動手指來繪制線條,現在我也想使該程序也繪制一個矩形。 我想創建兩個菜單項,這些菜單項確定了我目前正在繪制的內容。 程序啟動時,它應該允許我自由繪制,但是當我單擊第二個菜單按鈕時,我應該能夠繪制一個矩形。 意思是,當我拖動手指時,程序會從起點到手指拖動的位置繪制一個矩形。 拖動/繪制矩形時,它應始終顯示矩形。

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);
    }

我有這段代碼,這使我可以自由繪制。 但是我不知道,當我單擊另一個菜單項時如何更改正在繪制的內容。 希望你理解我的問題:)

編輯:使此菜單選擇起作用,現在,如果有人可以教我如何繪制矩形,那就太好了;)

在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”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM