El acelerómetro de iPhone funciona incluso en superficies planas
-
10-07-2019 - |
Pregunta
Tengo una imageView en la vista. Se mueve incluso si el iPhone permanece quieto por algún tiempo. Por que es esto entonces ? Además, la imagen no responde rápidamente al movimiento del iphone.
Aquí está mi código escrito para esto:
También configuré updateInterval y delegué el acelerómetro.
#define kVelocityMultiplier 1000;
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
if(currentPoint.x < 0)
{
currentPoint.x=0;
ballXVelocity=0;
}
if(currentPoint.x > 480-sliderWidth)
{
currentPoint.x=480-sliderWidth;
ballXVelocity=0;
}
static NSDate *lastDrawTime;
if(currentPoint.x<=480-sliderWidth&¤tPoint.x>=0)
{
if(lastDrawTime!=nil)
{
NSTimeInterval secondsSinceLastDraw=-([lastDrawTime timeIntervalSinceNow]);
ballXVelocity = ballXVelocity + -acceleration.y*secondsSinceLastDraw;
CGFloat xAcceleration=secondsSinceLastDraw * ballXVelocity * kVelocityMultiplier;
currentPoint = CGPointMake(currentPoint.x + xAcceleration, 266);
}
slider.frame=CGRectMake(currentPoint.x, currentPoint.y, sliderWidth, 10);
}
[lastDrawTime release];
lastDrawTime=[[NSDate alloc]init];
}
¿Alguien puede ayudarme por favor?
Solución
Noto un par de cosas en el código
-
Las dos primeras declaraciones if para tener la posición dentro de un cierto rango deben hacerse justo antes de establecer la posición del control deslizante; de ??lo contrario, puede suceder que la imagen se establezca fuera del rango preferido.
ballXVelocity
se calcula como normalizado a partir del valoracceleration.y
multiplicado por el tiempo delta. Tal vez debería considerar multiplicar ese factor en lugar de hacer elkVelocityMultiplier
en la siguiente línea.-
Como el acelerómetro es muy sensible y es difícil hacer un ajuste perfecto en la placa de circuito, nunca se obtiene un valor perfecto. En su lugar, uno debería tratar de tener alguna etapa de calibración y quizás usar solo un rango válido similar a las dos primeras declaraciones if.
Otros consejos
Puede considerar filtrar sus valores a la manera de Apple.
#define kFilteringFactor 0.15
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
accelx = acceleration.x * kFilteringFactor + accelx * (1.0 - kFilteringFactor);
accely = acceleration.y * kFilteringFactor + accely * (1.0 - kFilteringFactor);
accelz = acceleration.y * kFilteringFactor + accelz * (1.0 - kFilteringFactor);}
accelx, accely y accelz son UIAccelerometerValues.
Entonces puedes hacer algo como
ball.position.x += accelx * ballSpeed * deltaDrawingTime;
El movimiento debería ser mejor ahora.