Entrada do acelerômetro

Flash Player 10.1 e posterior, Adobe AIR 2 e posterior

A classe Accelerometer despacha eventos com base na atividade detectada pelo sensor de movimento do dispositivo. Estes dados representam o local do dispositivo ou movimento ao longo de um eixo de tridimensional. Quando o dispositivo se move, o sensor detecta este movimento e retorna as coordenadas de aceleração do dispositivo. A classe Accelerometer fornece métodos para consultar se o acelerômetro é suportado ou não e também para definir a taxa na qual os eventos de aceleração são despachados.

Os eixos do acelerômetro são normalizados na orientação do visor, e não na orientação física do dispositivo. Quando o dispositivo reorienta o visor, os eixos do acelerômetro também são reorientados. Assim, o eixo Y está sempre aproximadamente na posição vertical quando o usuário segura o telefone na posição vertical normal de exibição, independentemente da maneira como o telefone é girado. Se a orientação automática estiver desligada, por exemplo quando o conteúdo SWF em um navegador está no modo de tela cheia, os eixos do acelerômetro não serão reorientados quando o dispositivo for girado.

Verificando suporte ao acelerômetro

Utilize a propriedade Accelerometer.isSupported para testar o ambiente de tempo de execução em relação a habilidade de utilizar este recurso:

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

A classe acelerômetro e seus membros são acessíveis pelas versões de tempo de execução listados em cada entrada de API. No entanto o ambiente atual durante o tempo de execução determina a disponibilidade para este recurso. Por exemplo, você pode compilar o código as propriedades da classe Accelerometer para o Flash Player 10.1, mas será necessário utilizar a propriedade Accelerometer.isSupported para testar a disponibilidade do recurso Accelerometer no dispositivo do usuário. Caso Accelerometer.isSupported seja true durante o tempo de execução, então o suporte ao Accelerometer existe.

Detectando mudanças no acelerômetro

Para utilizar o sensor de acelerômetro, instancie um objeto Accelerometer e registre para atualizar eventos enviados. O evento update é um objeto de evento Accelerometer. O evento possui quatro propriedades, são eles:

  • accelerationX —Aceleração ao longo do eixo x, medida em g. O eixo x vai da esquerda para a direita do dispositivo quando está na posição perpendicular. (O dispositivo está na vertical quando o topo do dispositivo está voltado para cima). A aceleração será positiva se o dispositivo for movido para a direita.

  • accelerationY —Aceleração ao longo do eixo y, medida em g. O eixo y percorre a parte superior do dispositivo quando está na posição perpendicular. (O dispositivo está na vertical quando o topo do dispositivo está voltado para cima). A aceleração será positiva se o dispositivo for movido para cima deste eixo.

  • accelerationZ —Aceleração ao longo do eixo z, medida em g. O eixo z corre perpendicularmente à parte fronta do dispositivo. A aceleração é positiva se você mover o dispositivo de forma que a face do dispositivo aponte para cima. A aceleração é negativa se a face do dispositivo apontar para o chão.

  • timestamp —O número de milissegundos no momento do evento a partir do início da execução.

1 g é a aceleração padrão da gravidade, aproximadamente 9.8 m/s 2. .

Este é um exemplo básico que exibe dados de um acelerômetro em um campo de texto:

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() 
}

Para utilizar este exemplo, certifique-se de criar o campo de texto accTextField e adicioná-lo para a lista de exibição antes de utilizar este código.

Você pode ajustar o intervalo de tempo para eventos de acelerômetro chamando o método setRequestedUpdateInterval() do objeto Accelerometer. Este método usa um parâmetro interval , que é o intervalo de atualização solicitado em milisegundos:

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

A hora real entre atualizações do acelerômetro pode ser maior ou menor do que este valor. Qualquer mudança no intervalo de atualização afeta todos os ouvintes registrados. Se o método setRequestedUpdateInterval() não for chamado, o aplicativo recebe atualizações com base no intervalo padrão do dispositivo.

Dados do acelerômetro tem alguns graus de imprecisão. Você pode utilizar uma média de movimento de dados recentes para aperfeiçoar os dados. Por exemplo, o exemplo a seguir fatora leituras recentes do acelerômetro com a leitura atual para obter um resultado arredondado:

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)); 
}

No entanto, esta média de movimentação só é desejável se o intervalo de atualização do acelerômetro for pequeno.