uniforme programacion movimiento julioprofe ejercicios ejemplos android math transform ontouchevent

programacion - Mover una imagen en movimiento circular basado en eventos táctiles en Android



movimiento circular uniforme julioprofe ejercicios (1)

  1. calcular el punto central del círculo
  2. obtener el punto de contacto actual
  3. calcular el ángulo entre el centro y el nuevo punto de contacto
  4. Calcule el punto en el círculo usando el ángulo y el radio del círculo (x = r * cos (ángulo), y = r * sin (ángulo)).
  5. Restablece la posición de la imagen al nuevo punto.

Para obtener el ángulo usa la ecuación siguiente

deltaY = P2_y - P1_y deltaX = P2_x - P1_x angleInDegrees = arctan(deltaY / deltaX) * 180 / PI //Code inside ACTION_MOVE case mInitialX = event.getX(); mInitialY = event.getY(); float deltaX = circleCenter.x - mInitialX; float deltaY = circleCenter.y - mInitialY; double angleInRadian = Math.atan2(yDiff, xDiff); PointF pointOnCircle = new PointF(); pointOnCircle.x = circleCenter.x + ((float)(circleRadius*(Math.cos(angleInRadian)))); pointOnCircle.y = circleCenter.y + ((float)(circleRadius*(Math.cos(angleInRadian))));

Estoy tratando de mover un ImageView (no girar). Se supone que el movimiento está en el borde de un círculo. Este círculo también es una vista de imagen.

basado en el evento onTouch, ACTION_MOVE, estoy intentando moverlo.

No, el Dilema es que el uso puede no mover el dedo de una manera perfectamente circular, pero me gustaría asegurarme de que la imagen aún se mueva alrededor del borde de este círculo.

Actualmente estoy usando lo siguiente dentro de ACTION_MOVE:

mCurrTempIndicator.setTranslationX(event.getX()); mCurrTempIndicator.setTranslationY(event.getY());

Pero esto no se moverá en un círculo perfecto.

alguien podría por favor ayudar.

ACTUALIZACIÓN: código

@Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mInitialX = event.getX(); mInitialY = event.getY(); break; case MotionEvent.ACTION_MOVE: mEndX = event.getX(); mEndY = event.getY(); float deltaX = mEndX - mInitialX; float deltaY = mEndY - mInitialY; double angleInDegrees = Math.atan(deltaY / deltaX) * 180 / Math.PI; mInitialX = mEndX; mInitialY = mEndY; mCurrTempIndicator.setRotation((float)angleInDegrees); mCurrTempIndicator.setTranslationX((float)(310*(Math.cos(angleInDegrees)))); mCurrTempIndicator.setTranslationY((float)(310*(Math.sin(angleInDegrees)))); break; case MotionEvent.ACTION_UP: allowRotating = true; break; } return true; }