2009-12-16 8 views

ответ

2

Ребята Apple, обеспечивают эту иллюстрацию того, как «сгладить» сырые данные, поступающие от акселерометра в документации:

#define kFilteringFactor 0.1 
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate: 
    (UIAcceleration *)acceleration { 
    // Use a basic low-pass filter to keep only the gravity component of each axis. 
    accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)); 
    accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)); 
    accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)); 
} 

После того, как у вас есть поток данных, просто изменить DeltaX, deltay у вас есть для набор изображений, в некоторых минимальных/максимальных диапазонов, и изменить положение каждого UIImageView, например:

// in your @interface somewhere 
float deltax, deltay; 
UIView* ivs[9]; 

// in your @implementation 
#define MINXDELTA (-40) 
#define MAXXDELTA (+40) 
#define MINYDELTA (-40) 
#define MAXYDELTA (+40) 
#define SPEEDFACTOR (5) 
#define kFilteringFactor 0.1 
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate: 
    (UIAcceleration *)acceleration { 
    // Use a basic low-pass filter to keep only the gravity component of each axis. 
    accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)); 
    accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)); 
    accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)); 
    deltax+=accelX*SPEEDFACTOR; deltay+=accelY*SPEEDFACTOR; 
    if (deltax<MINXDELTA) deltax=MINXDELTA; 
    if (deltay<MINYDELTA) deltay=MINYDELTA; 
    if (deltax>MINXDELTA) deltax=MINXDELTA; 
    if (deltay>MINYDELTA) deltay=MINYDELTA; 
    [self positionImages]; 
} 
// call this from init too 
-(void)positionImages { 
    // assumes you have 9 images arranged as 3x3 on 40 pixel grid centered at 100,100 
    for (ix=0; ix<3; ix++) for (iy=0; iy<3; iy++) { 
    UIImageView *iv=ivs[ix+iy*3]; 
    CGPoint c=CGMakePoint(100-40+40*ix, 100-40+40*iy); 
    iv.center=c; 
    } 
} 

EDIT

Некоторые незначительные опечатки выше.

UIView* ivs[9]; 

должен быть

UIImageView* ivs[9]; 

и

if (deltax>MINXDELTA) deltax=MINXDELTA; 
    if (deltay>MINYDELTA) deltay=MINYDELTA; 

должен быть

if (deltax>MAXXDELTA) deltax=MAXXDELTA; 
    if (deltay>MAXYDELTA) deltay=MAXYDELTA; 

Это достаточно указателю/я оставлю его там, я думаю.

+0

благодарит за ответ! можете ли вы объяснить немного больше? как определить изображения здесь, что вызывать в viewdidload? – omri

+0

() * Для этого простого примера изображения и изображения, созданные с помощью [UIImage imageWithContentsOfFile], [UIImageView initWithFrame: CGMakeRect (0,0,0,0)], [UIImageView setImage:] и [someParentView addSubView:] в [ UIApplicationDelegate init] * Обращается к API-интерфейсу акселерометра, чтобы сообщить ему, чтобы он начинал и останавливал вызов. Метод didAccelerate тоже требуется * Если вы используете контрольные контроллеры, вы можете вызвать [appDelegate positionImages] из вашего метода viewController viewDidLoad – martinr

+0

i ' m имеет проблему с методом positionImages: 1. Как объявить ix и iy? 2. Я получаю недействительный инициализатор на этом - UIImageView * iv = ivs [ix + iy * 3]; 3. Я хочу использовать uiimageview, расположенный уже на представлении с помощью ib (для разделения местоположения я не знаю, как это сделать на коде ...). спасибо! btw [appDelegate positionImages] вы имели в виду [self positionImages]? – omri

Смежные вопросы