Estoy tratando de escribir una aplicación de prueba de concepto simple que le permita al usuario girar el minutero de un reloj. Tengo problemas para encontrar la lógica correcta para OnTouchEvent.Mueva la manecilla de los minutos en el reloj de Android
Hasta ahora tengo el siguiente código:
public boolean onTouchEvent(MotionEvent e) {
float x = e.getX();
float y = e.getY();
switch (e.getAction()) {
case MotionEvent.ACTION_MOVE:
//find an approximate angle between them.
float dx = x-cx;
float dy = y-cy;
double a=Math.atan2(dy,dx);
this.degree = Math.toDegrees(a);
this.invalidate();
}
return true;
}
protected void onDraw(Canvas canvas) {
super .onDraw(canvas);
boolean changed = mChanged;
if (changed) {
mChanged = false;
}
int availableWidth = getRight() - getLeft();
int availableHeight = getBottom() - getTop();
int x = availableWidth/2;
int y = availableHeight/2;
cx = x;
cy = y;
final Drawable dial = mDial;
int w = dial.getIntrinsicWidth() + 100;
int h = dial.getIntrinsicHeight() + 100;
boolean scaled = false;
if (availableWidth < w || availableHeight < h) {
scaled = true;
float scale = Math.min((float) availableWidth/(float) w, (float) availableHeight/(float) h);
canvas.save();
canvas.scale(scale, scale, x, y);
}
if (changed)
{
dial.setBounds(x - (w/2), y - (h/2), x + (w/2), y + (h/2));
}
dial.draw(canvas);
canvas.save();
float hour = mHour/12.0f * 360.0f;
canvas.rotate(hour, x, y);
final Drawable hourHand = mHourHand;
if (changed) {
w = hourHand.getIntrinsicWidth() + 30;
h = hourHand.getIntrinsicHeight() + 30;
hourHand.setBounds(x - (w/2), y - (h/2), x + (w/2), y + (h/2));
}
hourHand.draw(canvas);
canvas.restore();
canvas.save();
float minute = mMinutes/60.0f * 360.0f;
if (bearing == 0)
{
canvas.rotate(minute, x, y);
}
else
{
canvas.rotate((float)bearing, x, y);
}
final Drawable minuteHand = mMinuteHand;
if (changed) {
w = minuteHand.getIntrinsicWidth() + 30;
h = minuteHand.getIntrinsicHeight() + 30;
minuteHand.setBounds(x - w, y - h, x + w, y + h);
}
minuteHand.draw(canvas);
canvas.restore();
if (scaled) {
canvas.restore();
}
}
A continuación, basándose en eso, mi método OnDraw hace girar la manecilla de los minutos a la especificada "this.degree" (solo llamadas canvas.rotate). Estoy asumiendo que mi matemática está fuera de aquí. Traté de seguir el ejemplo aquí: Calculate angle for rotation in Pie Chart, pero eso aún no está rotando la manecilla de los minutos correctamente. Cualquier ayuda sería apreciada.
Gracias. Volveré a verificar mi punto central. Creo que el problema es que el punto central es relativo a toda la pantalla, no al reloj. así que es algo así como 240, 240. Ese podría ser el verdadero problema. ¿Pensamientos? – bek
@ user968322 He agregado algunos detalles adicionales con respecto al centro de rotación – JesusFreke
intenté todo, aún no tuve suerte. Comienza a moverse hacia direcciones aleatorias. actualicé el código original en mi publicación. – bek