Android webview-android中如何开发摇一摇的应用?

Android webview-android中如何开发摇一摇的应用?

清晨说ぺ晚安 发布于 2017-08-10 字数 77 浏览 1026 回复 2

如何检测用户是否支持摇一摇的功能?如何实现摇一摇的时候响应?什么原理?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

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

评论(2

瑾兮 2017-09-04 2 楼

摇一摇功能只使用到Sensor.TYPE_ACCELEROMETER加速度传感器

首先acticity要实现SensorEventListener接口

初始化传感器服务 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

然后重写onSensorChanged方法根据时间类型和偏移值判断即可 事件类型:event.sensor.getType() 偏移值 event.values

加速度传感器返回值的单位是加速度的单位 m/s^2(米每二次方秒),有三个方向的值分别是
  values[0]: x-axis 方向加速度
  values[1]: y-axis 方向加速度
  values[2]: z-axis 方向加速度
  其中x,y,z方向的定义是以水平放置在的手机的右下脚为参照系坐标原点
  x 方向就是手机的水平方向,右为正
  y 方向就是手机的水平垂直方向,前为正
  z方向就是手机的空间垂直方向,天空的方向为正,地心的方向为负

最后要注意在onStop() onPause()里注销传感器的服务 mSensorManager.unregisterListener(this);

onResume()里重载服务 ://加速度传感器

mSensorManager.registerListener(this,

mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),

//还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,

//根据不同应用,需要的反应速率不同,具体根据实际情况设定

SensorManager.SENSOR_DELAY_NORMAL);

以上纯属转载……

晚风撩人 2017-08-21 1 楼

以下代码来自百度+Google。

晃动检测是基于加速传感器的(Sensor.TYPE_ACCELEROMETER),其原理是通过监听加速度的变化来判断手机是否在晃动。那么如何计算加速的的变化呢? 计算加速度的变化即在一个较短的时间间隔求出加速的的差值,然后将这个差值与一个指定的阈值进行比较,如果差值大于阈值则认为是手机发生了晃动。加速度具体的计算方法通常是将x,y,z方向的加速度差值加起来,但是这种方法并不是很准确,由于加速度是向量,更为精确的方法是将各方向的加速度差值的平方加起来再开方。当然如果有必要的话,从物理角度考虑,我们可以计算出加速度在某一方向(任意方向)的变化,这就需要大家再回顾下物理了。核心的原理说完了,直接看代码吧:

package zhengzhiren.android.hardware;

import java.util.ArrayList;

import android.content.Context;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.util.FloatMath;

/**

用于检测手机摇晃

*

*

*/

public class ShakeDetector implements SensorEventListener {

/**

检测的时间间隔

*/

static final int UPDATE_INTERVAL = 100;

/**

上一次检测的时间

*/

long mLastUpdateTime;

/**

上一次检测时,加速度在x、y、z方向上的分量,用于和当前加速度比较求差。

*/

float mLastX, mLastY, mLastZ;

Context mContext;

SensorManager mSensorManager;

ArrayList<OnShakeListener> mListeners;

/**

摇晃检测阈值,决定了对摇晃的敏感程度,越小越敏感。

*/

public int shakeThreshold = 5000;

public ShakeDetector(Context context) {

mContext = context;

mSensorManager = (SensorManager) context

.getSystemService(Context.SENSOR_SERVICE);

mListeners = new ArrayList<OnShakeListener>();

}

/**

当摇晃事件发生时,接收通知

*/

public interface OnShakeListener {

/**

当手机摇晃时被调用

*/

void onShake();

}

/**

注册OnShakeListener,当摇晃时接收通知

*

*/

public void registerOnShakeListener(OnShakeListener listener) {

if (mListeners.contains(listener))

return;

mListeners.add(listener);

}

/**

移除已经注册的OnShakeListener

*

*

*/

public void unregisterOnShakeListener(OnShakeListener listener) {

mListeners.remove(listener);

}

/**

启动摇晃检测

*/

public void start() {

if (mSensorManager == null) {

throw new UnsupportedOperationException();

}

Sensor sensor = mSensorManager

.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

if (sensor == null) {

throw new UnsupportedOperationException();

}

boolean success = mSensorManager.registerListener(this, sensor,

SensorManager.SENSOR_DELAY_GAME);

if (!success) {

throw new UnsupportedOperationException();

}

}

/**

停止摇晃检测

*/

public void stop() {

if (mSensorManager != null)

mSensorManager.unregisterListener(this);

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

@Override

public void onSensorChanged(SensorEvent event) {

long currentTime = System.currentTimeMillis();

long diffTime = currentTime - mLastUpdateTime;

if (diffTime > UPDATE_INTERVAL){

if(mLastUpdateTime!=0){

float x = event.values[0];

float y = event.values[1];

float z = event.values[2];

float deltaX = x - mLastX;

float deltaY = y - mLastY;

float deltaZ = z – mLastZ;

float delta = FloatMath.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ

deltaZ)

/ diffTime * 10000;

if (delta > shakeThreshold) { // 当加速度的差值大于指定的阈值,认为这是一个摇晃

this.notifyListeners();

}

mLastX = x;

mLastY = y;

mLastZ = z;

mLastUpdateTime = currentTime;

}

}

}

/**

当摇晃事件发生时,通知所有的listener

*/

private void notifyListeners() {

for (OnShakeListener listener : mListeners) {

listener.onShake();

}

}

}

如何使用ShakeDetector:

new一个ShakeDetector

调用mShakeDetector.registerOnShakeListener()注册一个OnShakeListener

在OnShakeListener的onShake函数中,处理摇晃事件

调用mShakeDetector.start()启动摇晃检测

mShakeDetector.stop()用于停止摇晃检测