如何检测设备的上下(乒乓)运动?

发布于 2024-12-26 17:02:38 字数 1436 浏览 4 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

完美的未来在梦里 2025-01-02 17:02:39
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();
            }
        }
    }

}

活动中:

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            sensorHandler = new SensorListener();
            sensorHandler.setOnDeviceShakeListener(new OnDeviceShakeListener() {
                @Override
                public void onDeviceShaked() {
                    //....
                }
            });
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() {
                    //....
                }
            });
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文