iPhone加速度计甚至可以在平坦的表面上工作

时间:2009-11-30 07:48:06

标签: iphone accelerometer

我在视图中有一个imageView。即使iPhone仍然存在一段时间它也会移动。为什么会这样?此外,图像不能快速响应iPhone的移动。

这是我为此编写的代码:

我还为加速度计设置了updateInterval和delegate。

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

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

您可以考虑以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和accelz是UIAccelerometerValues。

然后你可以做类似

的事情
ball.position.x += accelx * ballSpeed * deltaDrawingTime;

现在运动应该更好。

答案 1 :(得分:0)

我注意到代码中的一些内容

  • 位置在特定范围内的两个第一个if语句应该在滑块位置设置之前完成,否则可能会将图像设置在首选范围之外。

    < / LI>
  • ballXVelocity的计算方法是从acceleration.y值到delta时间的标准化。也许你应该考虑乘以那个因素而不是在下一行做kVelocityMultiplier

  • 由于加速度计非常灵敏,很难在电路板上完美贴合,因此永远无法获得完美的价值。相反,应该尝试使用一些校准阶段,并且可能只使用类似于两个第一个if语句的有效范围。