views:

448

answers:

2

I have an imageView in the view. It moves even if the iphone is still for some time. Why is it so ? Also the image does not respond quickly to the movement of the iphone.

Here is my code written for this:

I have also set the updateInterval and delegate for the accelerometer.

#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&&currentPoint.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];
}

Can anyone help me out please ?

A: 

I notice a couple of things in the code

  • The two first if statements to have the position within a certain range should be done just before the slider position is set, otherwise it can happen that the image will be set outside the preferred range.

  • ballXVelocity is calculated as normalized from the acceleration.y value times the delta time. Maybe you should look into multiplying that factor instead of doing the kVelocityMultiplier on the next line.

  • As the accelerometer is very sensitive and it is hard to make perfect fit on the circuitboard one never get perfect value. Instead one should try to have some calibration stage and perhaps use only a valid range similar the two first if statements.

epatel
A: 

You might consider filtering your values the Apple way.

#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 and accelz are UIAccelerometerValues.

Then you can do something like

ball.position.x += accelx * ballSpeed * deltaDrawingTime;

The movement should be nicer now.

Thomas