如何检测上下(乒乓球)设备的运动? [英] How can I detect the up-down (Ping-pong) movement of device?
本文介绍了如何检测上下(乒乓球)设备的运动?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有采用的是Android游戏骰子游戏,当你上下移动设备像一个乒乓球球拍,它在屏幕抛出骰子。
我要检测装置的这种运动。我该怎么做?
谢谢,
解决方案
包org.mabna.order.utils;公共接口OnDeviceShakeListener {
公共抽象无效onDeviceShaked();
}
进口的java.util.ArrayList;进口android.content.Context;
进口android.hardware.Sensor;
进口android.hardware.SensorEvent;
进口android.hardware.SensorEventListener;公共类SensorListener实现SensorEventListener { 浮动[] = xVals新的浮动[] {0,0,0};
浮动[] = yVals新的浮动[] {0,0,0};
长prevTime = 0; 最终浮动角= 10;
最后的时间长= 100 * 1000 * 1000; //在纳秒 公共SensorListener()
{ } @覆盖
公共无效onAccuracyChanged(传感器传感器,精度INT){
// TODO自动生成方法存根 } @覆盖
公共无效onSensorChanged(SensorEvent事件){
同步(本){ 如果(event.sensor.getType()== Sensor.TYPE_ORIENTATION){
如果(event.timestamp - prevTime>时间)
{
prevTime = event.timestamp; xVals [0] = xVals [1];
xVals [1] = xVals [2];
xVals [2] = event.values [1]; yVals [0] = yVals [1];
yVals [1] = yVals [2];
yVals [2] = event.values [2]; 如果(degreeChanged(xVals)||
degreeChanged(yVals))
{
OnDeviceShaked();
}
} } }
} 私人布尔degreeChanged(浮法[] V){ 浮V0 = Math.abs(Ⅴ[0]);
浮V1 = Math.abs(Ⅴ[1]);
浮V2 = Math.abs(Ⅴ[2]); 布尔hasAngle =((V1 - V 0)>角放大器;及(V1 - V2)GT;角); 返回hasAngle;
} // DeviceShakeListener ----------------------------------------------- ----- ArrayList的< OnDeviceShakeListener> arrOnDeviceShakeListener =
新的ArrayList< OnDeviceShakeListener>(); / **
*如果侦听设备被摇得像乒乓球球拍。
*
* @参数监听器
* /
公共无效setOnDeviceShakeListener(
OnDeviceShakeListener监听){
arrOnDeviceShakeListener.add(监听);
} 公共无效clearOnDeviceShakeListener(
OnDeviceShakeListener监听){
arrOnDeviceShakeListener.remove(监听);
} //该函数在接收到新的点称为后
私人无效OnDeviceShaked(){
//检查监听器设置,否则我们会得到一个异常时,
//我们尝试调用它
如果(arrOnDeviceShakeListener!= NULL){
//只有触发事件,当我们有任何监听器 对于(INT I = arrOnDeviceShakeListener.size() - 1; I> = 0;我 - ){
arrOnDeviceShakeListener.get(ⅰ).onDeviceShaked();
}
}
}}
在活动:
的SensorManager =(的SensorManager)getSystemService(SENSOR_SERVICE);
sensorHandler =新SensorListener();
sensorHandler.setOnDeviceShakeListener(新OnDeviceShakeListener(){
@覆盖
公共无效onDeviceShaked(){
// ....
}
});
There is a dice game in android games that when you move up and down your device like a Ping-pong racket, it throws dices in the screen.
I want to detect this movement of device. How can I do that?
Thanks,
解决方案
package org.mabna.order.utils;
public interface OnDeviceShakeListener {
public abstract void onDeviceShaked();
}
import java.util.ArrayList;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
public class SensorListener implements SensorEventListener {
float[] xVals = new float[] { 0, 0, 0 };
float[] yVals = new float[] { 0, 0, 0 };
long prevTime = 0;
final float angle = 10;
final long time = 100 * 1000 * 1000; // in nanosecond
public SensorListener()
{
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
if (event.timestamp - prevTime > time)
{
prevTime = event.timestamp;
xVals[0] = xVals[1];
xVals[1] = xVals[2];
xVals[2] = event.values[1];
yVals[0] = yVals[1];
yVals[1] = yVals[2];
yVals[2] = event.values[2];
if (degreeChanged(xVals) ||
degreeChanged(yVals))
{
OnDeviceShaked();
}
}
}
}
}
private boolean degreeChanged(float[] V) {
float v0 = Math.abs(V[0]);
float v1 = Math.abs(V[1]);
float v2 = Math.abs(V[2]);
boolean hasAngle = ((v1 - v0) > angle && (v1 - v2) > angle);
return hasAngle;
}
// DeviceShakeListener ----------------------------------------------------
ArrayList<OnDeviceShakeListener> arrOnDeviceShakeListener =
new ArrayList<OnDeviceShakeListener>();
/**
* Listens if device is shaken like a Ping-pong racket.
*
* @param listener
*/
public void setOnDeviceShakeListener(
OnDeviceShakeListener listener) {
arrOnDeviceShakeListener.add(listener);
}
public void clearOnDeviceShakeListener(
OnDeviceShakeListener listener) {
arrOnDeviceShakeListener.remove(listener);
}
// This function is called after the new point received
private void OnDeviceShaked() {
// Check if the Listener was set, otherwise we'll get an Exception when
// we try to call it
if (arrOnDeviceShakeListener != null) {
// Only trigger the event, when we have any listener
for (int i = arrOnDeviceShakeListener.size() - 1; i >= 0; i--) {
arrOnDeviceShakeListener.get(i).onDeviceShaked();
}
}
}
}
In Activity:
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorHandler = new SensorListener();
sensorHandler.setOnDeviceShakeListener(new OnDeviceShakeListener() {
@Override
public void onDeviceShaked() {
//....
}
});
这篇关于如何检测上下(乒乓球)设备的运动?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文