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;
/**
* 用于检测手机晃动
*
* @author 郑智仁
*/
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,当摇晃时接收通知
*
* @param listener
*/
public
void
registerOnShakeListener(OnShakeListener listener) {
if
(mListeners.contains(listener))
return
;
mListeners.add(listener);
}
/**
* 移除已经注册的OnShakeListener
*
* @param listener
*/
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) {
}
@Override
public
void
onSensorChanged(SensorEvent event) {
long
currentTime = System.currentTimeMillis();
long
diffTime = currentTime - mLastUpdateTime;
if
(diffTime < UPDATE_INTERVAL)
return
;
mLastUpdateTime = currentTime;
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;
mLastX = x;
mLastY = y;
mLastZ = z;
float
delta = FloatMath.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
* deltaZ)
/ diffTime *
10000
;
if
(delta > shakeThreshold) {
this
.notifyListeners();
}
}
/**
* 当摇晃事件发生时,通知所有的listener
*/
private
void
notifyListeners() {
for
(OnShakeListener listener : mListeners) {
listener.onShake();
}
}
}
相关推荐
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
2. **重力感应器**:Android设备内置的重力感应器是实现甩歌功能的关键。它能检测设备在三维空间中的加速度变化,包括重力加速度和动态加速度。通过监听SensorManager的SensorEvent事件,可以获取到设备的实时姿态...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——...
8. **自定义视图**:为了实现独特的表白效果,开发者可能会创建自定义视图类,扩展Android的View或ViewGroup,以实现更复杂的交互和视觉效果。 9. **第三方库集成**:为了简化开发或增强功能,源码中可能会集成一些...
"甩歌"功能是一种手势识别的实现,通常依赖于SensorManager类,监听加速度传感器的变化。当检测到特定的甩动模式(比如设备的加速度在短时间内迅速改变)时,播放器会执行下一首或上一首歌曲的操作。 歌词同步功能...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
——具选择功能的对话框 3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
源码中还提到了“甩你画布”(可能是指“刷新画布”或“重绘画布”),这指的是Android的Canvas对象和绘图操作。在每次角色或箱子移动后,需要更新界面显示,这就需要用到`Canvas`进行绘制。开发者可能使用`onDraw()...
FireMonkey是Embarcadero Technologies开发的一个跨平台UI框架,用于构建高性能的原生应用程序,支持Windows、macOS、iOS和Android等多个操作系统。 百叶窗动画是一种常见于用户界面设计中的过渡效果,它模拟了百叶...
海尔LE55A700K的无线甩屏功能,极大地增加了电视使用的便利性。海信LED50K610X3D则是通过深度定制的Android系统和丰富的智能应用,为用户提供了内容丰富的娱乐体验。 不仅如此,一些传统品牌如松下和夏普,也在保持...
发布会还展示了华为7英寸的平板电脑MediaPad,运行Android 3.2系统,搭载1.2GHz双核处理器,配备分辨率为1280x800的IPS屏幕,支持1080P全高清视频播放。据透露,MediaPad预计在第三季度在国内上市,售价约3000元...