Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo dibujar una línea entre puntos y tirar de esos puntos?

Quiero dibujar las líneas entre los puntos de la vista, y luego tirar de los puntos hasta las posiciones deseadas, incluso la forma va a cambiar.

Sé cómo dibujar la línea entre dos puntos canvas.drawLine(10, 10, 90, 10, paint); Usando esto puedo dibujar las líneas entre los puntos.

EDIT : aquí estoy adjuntando la imagen para una explicación clara, de Paul respuesta ahora soy capaz de dibujar las líneas entre los puntos, todavía tienen el problema de tirar puntos …

Introduzca aquí la descripción de la imagen

  • No se pueden establecer puntos de interrupción en Eclipse
  • El dispositivo Android se desconecta del depurador unos segundos después de que se ha alcanzado el punto de interrupción
  • Android / Java: onProgressUpdate () no se llama?
  • El depurador de Android Studio no se detiene en puntos de interrupción dentro de módulos de biblioteca
  • Adjuntar depurador al proceso de Android automáticamente en Android Studio
  • No es capaz de golpear el punto de interrupción en ndk-gdb en Android
  • El punto de interrupción de primera línea sólo funciona
  • 4 Solutions collect form web for “¿Cómo dibujar una línea entre puntos y tirar de esos puntos?”

    Así es como se hace. Supongamos que tienes tus puntos, hazlos globales:

     PointF topLeft = new PointF(10,10); PointF topRight = new PointF(90,10); PointF bottomLeft = new PointF(10,90); PointF bottomRight = new PointF(90,90); 

    Lo que usted necesita hacer es hacer un RectF alrededor de cada punto. Cuanto mayor sea el RectF, mayor será el área táctil para el punto.

     float sizeOfRect = 5f; RectF topLeftTouchArea = new RectF(topLeft.x - sizeOfRect, topLeft.y - sizeOfRect, topLeft.x + sizeOfRect, topLeft.y + sizeOfRect); //Do this for the other points too 

    Defina algunos globales para realizar un seguimiento de lo que el usuario está haciendo en onTouch. Una int es la esquina que se toca, y los otros cuatro son identificadores para las esquinas.

     private final int NONE = -1, TOUCH_TOP_LEFT = 0, TOUCH_TOP_RIGHT = 1, TOUCH_BOT_LEFT = 2, TOUCH_BOT_RIGHT = 3; int currentTouch = NONE; 

    Ahora, en su evento onTouch, puede comprobar en qué punto su usuario está tocando de esta manera:

     @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { //The user just put their finger down. //We check to see which corner the user is touching //And set our global, currentTouch, to the appropriate constant. case MotionEvent.ACTION_DOWN: if (topLeftTouchArea.contains(event.getX(), event.getY()) { currentTouch = TOUCH_TOP_LEFT; } else if (topRightTouchArea.contains(event.getX(),event.getY()) { currentTouch = TOUCH_TOP_RIGHT; } else if (botLeftTouchArea.contains(event.getX(),event.getY()) { currentTouch = TOUCH_BOT_LEFT; } else if (botRightTouchArea.contains(event.getX(), event.getY()) { currentTouch = TOUCH_BOT_RIGHT; } else { return false; //Return false if user touches none of the corners } return true; //Return true if the user touches one of the corners //Now we know which corner the user is touching. //When the user moves their finger, we update the point to the user position and invalidate. case MotionEvent.ACTION_MOVE: switch (currentTouch) { case TOUCH_TOP_LEFT: topLeft.x = event.getX(); topLeft.y = event.getY(); //The bottom left x position has to move with the top left corner bottomLeft.x = topLeft.x; //The top right y position has to move with the top left corner topRight.y = topLeft.y; invalidate(); return true; case TOUCH_TOP_RIGHT: topRight.x = event.getX(); topRight.y = event.getY(); //The top left y position has to move with the top right corner topLeft.y = topRight.y; //The bottom right x position has to move with the top right corner bottomRight.x = topRight.x; invalidate(); return true; case TOUCH_BOT_LEFT: bottomLeft.x = event.getX(); bottomLeft.y = event.getY(); bottomRight.y = bottomLeft.y; topLeft.x = bottomLeft.x; invalidate(); return true; case TOUCH_BOT_RIGHT: bottomRight.x = event.getX(); bottomRight.y = event.getY(); topRight.x = bottomRight.x; bottomLeft.y = bottomRight.y; invalidate(); return true; } //We returned true for all of the above cases, because we used the event return false; //If currentTouch is none of the above cases, return false //Here the user lifts up their finger. //We update the points one last time, and set currentTouch to NONE. case MotionEvent.ACTION_UP: switch (currentTouch) { case TOUCH_TOP_LEFT: topLeft.x = event.getX(); topLeft.y = event.getY(); //The bottom left x position has to move with the top left corner bottomLeft.x = topLeft.x; //The top right y position has to move with the top left corner topRight.y = topLeft.y; invalidate(); currentTouch = NONE; return true; case TOUCH_TOP_RIGHT: topRight.x = event.getX(); topRight.y = event.getY(); //The top left y position has to move with the top right corner topLeft.y = topRight.y; //The bottom right x position has to move with the top right corner bottomRight.x = topRight.x; invalidate(); currentTouch = NONE; return true; case TOUCH_BOT_LEFT: bottomLeft.x = event.getX(); bottomLeft.y = event.getY(); bottomRight.y = bottomLeft.y; topLeft.x = bottomLeft.x; invalidate(); currentTouch = NONE; return true; case TOUCH_BOT_RIGHT: bottomRight.x = event.getX(); bottomRight.y = event.getY(); topRight.x = bottomRight.x; bottomLeft.y = bottomRight.y; invalidate(); currentTouch = NONE; return true; } return false; } } 

    Lo que esto hace es hacer un rectángulo alrededor de su punto. Imagine dibujar cajas alrededor de sus puntos en la imagen. Estas son las "almohadillas táctiles" creadas por los objetos Rect. El tamaño del rectángulo se establece mediante sizeOfRect. En el onTouchEvent, comprueba cada objeto de rectángulo para ver si el tacto del usuario está dentro del rectángulo, señalando al usuario que intenta tocar ese punto.

    Creo que puede estar buscando la clase Path :

    La clase Path encapsula trazados geométricos compuestos (de contorno múltiple) que consisten en segmentos de línea recta, curvas cuadráticas y curvas cúbicas. Se puede dibujar con canvas.drawPath (ruta, pintura), ya sea llena o acariciada (basada en el estilo de la pintura), o puede utilizarse para recortar o dibujar texto en una ruta.

    Vea este tutorial para ver ejemplos de canvas.drawPath

     import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.PointF; import android.view.MotionEvent; import android.view.View; public class TestView extends View { private Paint paint; private PointF startPoint, endPoint; private boolean isDrawing; public TestView(Context context) { super(context); init(); } private void init() { paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Style.STROKE); paint.setStrokeWidth(2); paint.setAntiAlias(true); } @Override protected void onDraw(Canvas canvas) { if(isDrawing) { canvas.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, paint); } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startPoint = new PointF(event.getX(), event.getY()); endPoint = new PointF(); isDrawing = true; break; case MotionEvent.ACTION_MOVE: if(isDrawing) { endPoint.x = event.getX(); endPoint.y = event.getY(); invalidate(); } break; case MotionEvent.ACTION_UP: if(isDrawing) { endPoint.x = event.getX(); endPoint.y = event.getY(); isDrawing = false; invalidate(); } break; default: break; } return true; } } 

    EDITAR:

    De hecho, es necesario utilizar la clase Path en android. Lo siento, no pude encontrar un fragmento de código. Pero aquí hay algo para empezar.

    Cuando dibuja una línea – canvas.drawLine(x1, y1, x2, y2, paint); Su punto de partida es (x1,y1) . Ahora, si usted necesita tirar de la línea de cualquier extremo, usted necesita arreglar primero el otro extremo. Digamos que tire de (x2,y2) . Así que (x1,y1) convierte en constante y se tira desde el otro extremo. Cuando utilice la clase Path, primero llame a moveTo() a este punto de moveTo() . Lo que hace es dar un punto sobre el que la línea tiene que ser movido. A continuación, puede utilizar la llamada lineTo() en los eventos táctiles para estirar la línea en consecuencia. Se necesitarán muchos ajustes. Pero esto es lo que puede empezar. Lo siento, no pude encontrar un fragmento, poco corto de tiempo. Consulte la documentación de la clase Path. Usted puede encontrar algunas cosas más útiles.


    EDITAR:

    Acerca de la adición de oyentes táctiles a los puntos:

    Supongamos que tiene una línea de (x1,y1) a (x2,y2) .

    Ahora para obtener el oyente de tacto para un punto, usted puede agregar un onTouchListener a su opinión entera.

     final View touchView = findViewById(R.id.touchView); touchView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getX() == x2 && event.getY() == y2) { //you know that you have clicked on the rear end of the line,so now you can do your dragging stuff. if(event.getAction() == MotionEvent.ACTION_DOWN){ //you know user has clicked in order to draw //redraw the existing line with black color to remove it paint.setColor(Color.BLACK); canvas.drawLine(x1, y1, x2, y2, paint); //reset the paint object paint.setColor(Color.WHITE); //now use moveTo() and lineTo() to attain the functionality of dragging on your Path object path.moveTo(x1,y1); path.lineTo(event.getX(),event.getY()); }else if(event.getAction() == MotionEvent.ACTION_MOVE){ path.lineTo(event.getX(),event.getY()); }else if(event.getAction() == MotionEvent.ACTION_UP){ } } return true; } }); 

    Esto es sólo una idea, todavía no tuve la oportunidad de probarlo. Espero que ayude.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.