如何检测上下(乒乓球)设备的运动? [英] How can I detect the up-down (Ping-pong) movement of device?

查看:185
本文介绍了如何检测上下(乒乓球)设备的运动?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有采用的是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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆