-1

私は一度に複数を移動するための良い流動的な方法を探してUIViewsScreenます。は、加速度を検出しActionたときに発生するはずです。Accelerometer私はすでにこの方法を試しました:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{

    CGPoint ObjectPos = Object.center;

    ObjectPos.x -= acceleration.x;

    Object.center = ObjectPos;
}

(もちろん、動きの検出を改善するためにいくつかの調整を追加しました)が、全体として、それはまだあまり流動的ではありません。

Core Animationに何らかの方法があるといいのですが、アクセラレーションではうまく機能しないようです。

助けてくれて本当にありがたいです、ありがとう!

4

1 に答える 1

0

このドキュメントを読むことをお勧めします: Isolating the Gravity Component from Acceleration Dataと、その下の「Isolating Instantaneous Motion from Acceleration Data」というセクション。

基本的に、スムーズな動きを得るには、重力を除外する必要があります。リンクはサンプルコードを提供します。

編集: UIAccelerometer は iOS 5.0 で廃止され、付属のドキュメントも削除されたようです。

将来の参考のために、私はいくつかの掘り下げを行い、元のサンプルコードの「カーボンコピー」と思われるものを見つけました(source):

// This example uses a low-value filtering factor to generate a value that uses 10 percent of the
// unfiltered acceleration data and 90 percent of the previously filtered value


// Isolating the effects of gravity from accelerometer data
#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));
    // Use the acceleration data.
}

// shows a simplified high-pass filter computation with constant effect of gravity.

// Getting the instantaneous portion of movement from accelerometer data
#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Subtract the low-pass value from the current value to get a simplified high-pass filter
    accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)) );
    accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)) );
    accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)) );
    // Use the acceleration data.
}
于 2012-12-25T22:49:45.237 に答える