Нарисуйте линию в представлении, используя Vector (в Android Studio) - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь нарисовать линию, мне удалось сделать это раньше, но первая точка как-то всегда была 0, 0. Теперь моя логика состоит в том, что есть два вектора, один для хранения каждой точки, по которой щелкают, и другойсохранить линию, состоящую из двух точек, по которым пользователь нажал.Я проверяю, не является ли Вектор пустым, и только тогда я рисую линию.Я действительно не знаю, что происходит, я перепробовал все, надеюсь, что некоторые из вас могут помочь, я действительно нуждаюсь.Спасибо.Здесь идет код из MyView.java:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.Vector;

public class MyView extends View {
    Paint paint = null;
    int figure;
    int lados_poly;
    int cor;
    int deletar;
    int CursorX, CursorY;
    int nrCliques;

    Vector<Ponto2D> ptsReta = new Vector<Ponto2D>();
    Vector<Reta> guardaRetas = new Vector<Reta>();

    public MyView(Context context) {
        super(context);
        paint = new Paint();
        figure = 0;
        cor = 0;
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setStrokeWidth(10);
        figure = 0;
        cor = 0;
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        paint = new Paint();
        figure = 0;
        cor = 0;
    }


    public void clickEcra() {
        setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:

                    case MotionEvent.ACTION_UP:

                        CursorX = (int)event.getX();
                        CursorY = (int)event.getY();

                        if (figure == 2){
                            Ponto2D ptReta = new Ponto2D();
                            ptReta.x = CursorX;
                            ptReta.y = CursorY;
                            ptsReta.add(ptReta);
                            if (ptsReta.size()> 0) {
                                for (int c = 0; c < ptsReta.size(); c++)
                                System.out.println("ptRetaX: " + ptsReta.get(c).x + " ptRetaY: " + ptsReta.get(c).y + " size " + ptsReta.size());
                            }
                            invalidate();
                        }

                    default:
                        return false;
                }
            }
        });
    }


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

        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.parseColor("#F5F1E0"));
        canvas.drawPaint(paint);
        paint.setColor(Color.parseColor("#3F5866"));

        //cores
        if (cor == 1) {
            paint.setColor(Color.parseColor("#393E46"));
        } else if (cor == 2){
            paint.setColor(Color.parseColor("#00ADB5"));
        } else if (cor == 3) {
            paint.setColor(Color.parseColor("#F8B500"));
        } else if (cor == 4) {
            paint.setColor(Color.parseColor("#FC3C3C"));
        }


        if (figure == 2) {
            if (ptsReta.size() >= 2) {
                for (int b = 0; b < ptsReta.size(); b = b + 2) {
                    Reta retinha = new Reta(ptsReta.get(b), ptsReta.get(b + 1));
                    guardaRetas.add(retinha);
                    System.out.println("pts: " + ptsReta.get(b) + ptsReta.get(b + 1));
                }
            }

            if (guardaRetas.size() > 0) {
                for (int r = 0; r < guardaRetas.size(); r++) {
                    canvas.drawLine(guardaRetas.get(r).pinicial.x, guardaRetas.get(r).pinicial.y, guardaRetas.get(r).pfinal.x, guardaRetas.get(r).pfinal.y, paint);
                }
            }
        }

        //clear canvas
        if (deletar == 2){
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(Color.parseColor("#F5F1E0"));
            canvas.drawPaint(paint);
            nrCliques = 0;
            ptsCirc.removeAllElements();
            ptsReta.removeAllElements();
        }
    }


    public void setfigure(int a) {
        this.figure = a;
    }

    public void Cor1_mudar(int text_cor) {
        this.cor = text_cor;
    }

    public void Resetar(int delete){
        this.deletar = delete;
    }
}

А теперь код из Line.java:

public class Reta {
    Ponto2D pinicial;
    Ponto2D pfinal;

    public Reta(){
        pinicial = new Ponto2D();
        pfinal = new Ponto2D();
    }

    public Reta(Ponto2D a, Ponto2D b) {
        pinicial = a;
        pfinal = b;
    }
}

Обновление: Рисует одну линию,и когда я пытаюсь сделать еще один, при третьем щелчке он закрывается, и мне нужно нарисовать несколько линий на холсте.

1 Ответ

0 голосов
/ 21 ноября 2018

Это были мои изменения, следующие внутри метода onDraw ():

    if (figure == 2) {
        if (ptsReta.size() %2 == 0) {
            for (int b = 0; b < ptsReta.size(); b = b + 2) {
                Reta retinha = new Reta(ptsReta.get(b), ptsReta.get(b + 1));
                guardaRetas.add(retinha);
            }

            if (guardaRetas.size() > 0) {
                for (int r = 0; r < guardaRetas.size(); r++) {
                    canvas.drawLine(guardaRetas.get(r).pinicial.x, guardaRetas.get(r).pinicial.y, guardaRetas.get(r).pfinal.x, guardaRetas.get(r).pfinal.y, paint);
                }
            }
        }
    }

А эти внутри метода click:

public void clickEcra() {
    setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:

                case MotionEvent.ACTION_UP:

                    CursorX = (int)event.getX();
                    CursorY = (int)event.getY();

                    if (figure == 2){
                        Ponto2D ptReta = new Ponto2D();
                        ptReta.x = CursorX;
                        ptReta.y = CursorY;
                        ptsReta.add(ptReta);
                        invalidate();
                    }

                default:
                    return false;
            }
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...