我在视图中有一个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&¤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];
}
有人可以帮帮我吗?
答案 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语句的有效范围。