Перемещение нескольких UIImageView с UIAccelerometer? - PullRequest
1 голос
/ 17 декабря 2009

любой может опубликовать или указать, как перемещать несколько UIImageView объектов в зависимости от движения Accelerometer.

спасибо.

1 Ответ

2 голосов
/ 17 декабря 2009

Ребята из 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));
}

Как только у вас есть поток данных, просто измените дельтакс, дельту, которую вы имеете для набора изображений, в пределах некоторого минимального / максимального диапазонов, и измените положение каждого 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...