가속도계 입력

Flash Player 10.1 이상, Adobe AIR 2 이상

Accelerometer 클래스는 장치의 모션 센서가 감지하는 작업에 기반하여 이벤트를 전달합니다. 이 데이터는 3차원 축을 따라 움직이는 장치의 위치 또는 이동을 나타냅니다. 장치가 이동하면 센서가 이 이동을 감지하고 장치의 가속 좌표를 반환합니다. Accelerometer 클래스는 가속도계가 지원되는지 여부를 쿼리하고 가속 이벤트를 전달하는 속도도 설정하는 메서드를 제공합니다.

가속도계 축은 장치의 실제 방향이 아닌 표시 방향을 기준으로 정규화됩니다. 장치에서 표시의 방향이 재조정되면 가속도계 축의 방향도 재조정됩니다. 따라서 사용자가 전화기를 정상적으로 들고 있는 경우 회전 방향에 상관없이 y축은 항상 대략적으로 수직 상태를 유지합니다. 예를 들어 자동 방향이 해제되어 있는 경우 브라우저에서 SWF 내용이 전체 화면 모드로 되어 있으면 장치가 회전할 때 가속도계 축의 방향이 재조정되지 않습니다.

가속도계 지원 확인

Accelerometer.isSupported 속성을 통해 런타임 환경에서 이 기능을 사용할 수 있는지 여부를 테스트합니다.

if (Accelerometer.isSupported) 
{ 
    // Set up Accelerometer event listeners and code. 
}

Accelerometer 클래스 및 해당 멤버는 각 API 항목에 대해 나열된 런타임 버전에 액세스할 수 있습니다. 그러나 이 기능의 사용 가능 여부는 런타임에서의 현재 환경에 따라 결정됩니다. 예를 들어 Flash Player 10.1의 Accelerometer 클래스 속성을 사용하여 코드를 컴파일할 수 있지만 사용자 장치에서 Accelerometer 기능을 사용할 수 있는지 여부를 테스트하려면 Accelerometer.isSupported 속성을 사용해야 합니다. 런타임에 Accelerometer.isSupportedtrue로 반환되면 가속도계가 현재 지원되는 것입니다.

가속도계 변경 감지

가속도계 센서를 사용하려면 Accelerometer 객체를 인스턴스화하고 이 객체가 전달하는 update 이벤트에 대해 등록합니다. update 이벤트는 Accelerometer 이벤트 객체로서 네 가지 속성을 가지며 모두 숫자 값입니다.

  • accelerationX - X축을 기준으로 한 가속 값(g 단위)입니다. X축은 바로 선 위치일 때 장치의 왼쪽에서 오른쪽으로 진행합니다. 바로 선 위치는 장치의 윗면이 위를 향하는 경우를 가리킵니다. 장치가 오른쪽을 향해 움직일 경우 가속은 양수입니다.

  • accelerationY - Y축을 기준으로 한 가속 값(g 단위)입니다. Y축은 바로 선 위치일 때 장치의 아래쪽에서 위쪽으로 진행합니다. 바로 선 위치는 장치의 윗면이 위를 향하는 경우를 가리킵니다. 장치가 이 축을 기준으로 위쪽으로 움직일 경우 가속은 양수입니다.

  • accelerationZ - Z축을 기준으로 한 가속 값(g 단위)입니다. Z축은 장치 면과 직각을 이룹니다. 장치의 윗면이 위를 향하도록 움직일 경우 가속은 양수입니다. 장치의 윗면이 아래를 향할 경우 가속은 음수입니다.

  • timestamp - 런타임이 초기화된 이후 이벤트가 발생하는 시점의 밀리초입니다.

1g는 중력으로 인한 표준 가속도로, 대략 9.8m/sec2.입니다.

다음은 텍스트 필드에 가속도계 데이터를 표시하는 기본적인 예제입니다.

var accl:Accelerometer; 
if (Accelerometer.isSupported) 
{ 
    accl = new Accelerometer(); 
    accl.addEventListener(AccelerometerEvent.UPDATE, updateHandler); 
} 
else 
{ 
    accTextField.text = "Accelerometer feature not supported"; 
} 
function updateHandler(evt:AccelerometerEvent):void 
{ 
    accTextField.text = "acceleration X: " + evt.accelerationX.toString() + "\n" 
            + "acceleration Y: " + evt.accelerationY.toString() + "\n" 
            + "acceleration Z: " + evt.accelerationZ.toString() 
}

이 예제 코드를 사용하려면 먼저 accTextField 텍스트 필드를 만들어 표시 목록에 추가해야 합니다.

Accelerometer 객체의 setRequestedUpdateInterval() 메서드를 호출하여 가속도계 이벤트의 원하는 시간 간격을 조정할 수 있습니다. 이 메서드는 interval 매개 변수 하나를 사용합니다. 이 매개 변수는 밀리초 단위의 요청된 업데이트 간격입니다.

var accl:Accelerometer; 
accl = new Accelerometer(); 
accl.setRequestedUpdateInterval(1000);

가속도계 업데이트의 실제 시간 간격은 이 값보다 크거나 작을 수 있습니다. 업데이트 간격을 변경하면 등록된 모든 리스너에 영향을 줍니다. setRequestedUpdateInterval() 메서드를 호출하지 않으면 응용 프로그램에서 장치의 기본 간격에 따라 업데이트를 받습니다.

가속도계 데이터는 어느 정도 부정확할 수 있습니다. 최근 데이터 이동 평균을 이용하여 가속도계 데이터를 다듬을 수 있습니다. 다음 예제와 같이 현재 판독값에 최근 가속도계 판독값을 고려하여 반올림한 결과를 얻을 수 있습니다.

var accl:Accelerometer; 
var rollingX:Number = 0; 
var rollingY:Number = 0; 
var rollingZ:Number = 0; 
const FACTOR:Number = 0.25; 
 
if (Accelerometer.isSupported) 
{ 
    accl = new Accelerometer(); 
    accl.setRequestedUpdateInterval(200); 
    accl.addEventListener(AccelerometerEvent.UPDATE, updateHandler); 
} 
else 
{ 
    accTextField.text = "Accelerometer feature not supported"; 
} 
function updateHandler(event:AccelerometerEvent):void 
{ 
    accelRollingAvg(event); 
    accTextField.text = rollingX + "\n" +  rollingY + "\n" + rollingZ + "\n"; 
} 
 
function accelRollingAvg(event:AccelerometerEvent):void 
{ 
    rollingX = (event.accelerationX * FACTOR) + (rollingX * (1 - FACTOR)); 
    rollingY = (event.accelerationY * FACTOR) + (rollingY * (1 - FACTOR)); 
    rollingZ = (event.accelerationZ * FACTOR) + (rollingZ * (1 - FACTOR)); 
}

그러나 이러한 이동 평균은 가속도계 업데이트 간격이 작은 경우에만 사용하는 것이 좋습니다.