android 摇一摇监听,Android摇一摇功能实现(摇一摇监听)
近期项目中要求增加摇一摇功能,搜了相关帖子,自己整理一套代码,发个博客保留一份。
解析:Android中摇一摇主要通过[SensorManager]实现,想了解可以查一下。
上期的不够完善 更新了一下,添加了防暴力摇动控制
public class ShakeService implements SensorEventListener {
private Context mContext;
private final MyHandler mHandler;
private static final int START_SHAKE = 0x1;
private static final int END_SHAKE = 0x2;
//传感器管理器
private SensorManager mSensorManager;
//检测的时间间隔
private static final int UPDATE_INTERVAL = 130;
//上一次检测的时间
private long mLastUpdateTime;
//上一次检测时,加速度在x、y、z方向上的分量,用于和当前加速度比较求差。
private float mLastX, mLastY, mLastZ;
//摇晃检测阈值,决定了对摇晃的敏感程度,越小越敏感。
private static final int shakeThreshold = 3800;
//记录摇动状态
private boolean isShake = false;
//动画
private Animation rotateAnimation, alphaAnimation, translateAnimation;
private static final int DURATION = 1000;
private static final int DURATION_STAR = 800;
public ShakeService(Context mContext) {
this.mContext = mContext;
mHandler = new MyHandler();
}
@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 =
(float) (Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / diffTime * 10000);
// 当加速度的差值大于指定的阈值,认为这是一个摇晃
if (delta > shakeThreshold && !isShake) {
isShake = true;
Thread thread = new Thread() {
@Override
public void run() {
super.run();
try {
if (isValid()) {
mHandler.obtainMessage(START_SHAKE).sendToTarget();
}
//开始 展示动画效果
//Thread.sleep(100);
//再来一次提示
} catch (Exception e) {
e.printStackTrace();
}
}
};
thread.start();
} else {
mHandler.obtainMessage(END_SHAKE).sendToTarget();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void start() {
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager != null) {
//传感器
Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if (mSensor != null) {
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
}
}
}
public void Stop() {
if (mSensorManager != null) {
mSensorManager.unregisterListener(this);
//清空消息队列
mHandler.removeCallbacks(null);
//置位可摇一摇
isShake = false;
//关闭动画
}
if (rotateAnimation != null) {
rotateAnimation.cancel();
}
if (alphaAnimation != null) {
alphaAnimation.cancel();
}
if (translateAnimation != null) {
translateAnimation.cancel();
}
}
private static final long intervalAtMillis = 1000L;
private static long sLastTime;
public static boolean isValid() {
//防止暴力摇动
long currentTime = System.currentTimeMillis();
if (currentTime - sLastTime < intervalAtMillis) {
return false;
}
sLastTime = currentTime;
return true;
}
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case START_SHAKE:
//发出动画触发,执行动画
break;
case END_SHAKE:
isShake = false;
break;
}
}
}
//接口回调,摇一摇开始通知外部
public interface onStartListener {
void onStart();
}
public onStartListener startListener;
public void setStartListener(onStartListener startListener) {
this.startListener = startListener;
}
}
动画部分 根据需求编写哦
private void devilDialog() {
final CustomDialog dialog = new CustomDialog(mContext);
View view = LayoutInflater.from(mContext).inflate(R.layout.view_jackpot_shake, null);
dialog.setCanceledOnTouchOutside(false);
dialog.setContentView(view);
dialog.show();
ImageView devilFish = view.findViewById(R.id.iv_devilFish);
ImageView background = view.findViewById(R.id.iv_background);
ImageView soccer = view.findViewById(R.id.iv_soccer);
ImageView star1 = view.findViewById(R.id.iv_star1);
ImageView star2 = view.findViewById(R.id.iv_star2);
ImageView star3 = view.findViewById(R.id.iv_star3);
rotateAnimation =
new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotateAnimation.setDuration(3000);
//rotateAnimation.setRepeatCount(Animation.INFINITE);
background.startAnimation(rotateAnimation);
rotateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//动画结束 关闭动画效果 通知外部摇一摇结束
if (startListener != null) {
startListener.onStart();
}
rotateAnimation.cancel();
alphaAnimation.cancel();
translateAnimation.cancel();
dialog.dismiss();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
//star闪烁
alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
alphaAnimation.setDuration(DURATION_STAR);
alphaAnimation.setRepeatCount(Animation.INFINITE);
alphaAnimation.setRepeatMode(Animation.REVERSE);
star1.setAnimation(alphaAnimation);
star2.setAnimation(alphaAnimation);
star3.setAnimation(alphaAnimation);
//soccer弹跳
translateAnimation = new TranslateAnimation(0, 0, 0, 25);
translateAnimation.setDuration(DURATION);
translateAnimation.setInterpolator(new CycleInterpolator(Animation.INFINITE));
translateAnimation.setRepeatCount(Animation.INFINITE);
soccer.setAnimation(translateAnimation);
}
android 摇一摇监听,Android摇一摇功能实现(摇一摇监听)相关推荐
- android 摇一摇动画效果,Android实现微信摇一摇功能
本文实例为大家分享了Android实现微信摇一摇功能的具体代码,供大家参考,具体内容如下 1.初始化界面 设置摇一摇界面的背景图片和摇动时的上下两半张图片 xmlns:tools="http ...
- android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键
本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){ ...
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...
- 【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )
文章目录 一.获取充电状态 二.被动获取充电状态 三.主动获取充电状态 参考 Google 官方文档 : 优化电池续航时间 一.获取充电状态 在应用中执行某些操作 , 如软件云端备份 , 从服务器端获 ...
- android 网卡监听,Android实时监听网络的变化
4中情况.1.无网 2.wifi 3.移动信号 4.网线 BroadcastReceiver netReceiver =new BroadcastReceiver(){ @Override publ ...
- android 回退函数,详解React Native监听Android回退按键与程序化退出应用
详解React Native监听Android回退按键与程序化退出应用 发布时间:2020-09-29 09:25:52 来源:脚本之家 阅读:137 作者:lqh 详解React Native监听A ...
- android横竖屏切换布局闪退,Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换...
在上一篇博客,Android-Activity临时数据的保存,中讲解到,当发生横竖屏切换的时候,系统会杀死Activity并重新启动Activity 系统会杀死Activity 12-12 08:11 ...
- android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件
Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...
- android 屏幕方向监听,Android如何监听屏幕旋转
背景 关于个人,前段时间由于业务太忙,所以一直没有来得及思考并且沉淀点东西:同时组内一个个都在业务上能有自己的思考和总结,在这样的氛围下,不由自主的驱使周末开始写点东西,希望自己除了日常忙于业务,可以 ...
- android 拨打电话、 监听来电、监听呼出电话的功能实现
demo1(通用): 权限 <!-- 监听呼出电话 --> <uses-permission android:name="android.permission.PROCES ...
最新文章
- liunx(3)-内核模块编写与系统调用
- 单片机中断机制对日常生活的启示_单片机原理与接口技术(高起专)阶段性作业1...
- 711 发送请求失败_会不会存在不失败的代理IP?
- 日期多选插件Kalendae.js
- yum升级CURL到最新版本的方法,非常好用
- 6.Composer实现PHP中类的自动加载
- 壁纸小程序云开发+无限裂变+附安装视频教程
- 社区团购小程序有哪些赚钱方式
- docker 安装snipe-it
- 30岁的我,裸辞、自甘堕落、重回生活:成功转行Python工程师,月入1W+
- c语言实现万年历教程
- 级联rc滤波_RC低通,高通滤波电路的基本工作原理
- 【英语天天读】优秀的标准
- linux关闭内存插槽,linux 统管理中的查看内存插槽数、最大容量和频率
- 边下边看 七款P2P下载软件全能大比拼
- 蓝筹股有哪些股票 蓝筹股有哪些股票2018
- 快速排序 Quick Sort
- 第四节 结构化分析方法的概念
- 【云计算】云计算四个必学知识看这里
- 安装BENQSCANNER 5560驱动与测试扫描
热门文章
- linux eclipse web插件,使用Tomcat插件开发WEB应用
- chrome 适配调试_移动端适配
- 我们自嘲的“码农”身份被官方实锤了!
- 皮一皮:唉唉...这钱还没收呢...
- 皮一皮:人生就像编程,总有防不胜防的bug会被人发现...
- 皮一皮:网络延迟的好处...
- 皮一皮:我也想做这样的房东,善解人意、为他人着想...
- 每日一皮:只有第一名才能拿金牌...
- JWT 入坑爬坑指南
- php函数多个参数_php中,用函数,如果有很多个参数,只使用最后一个参数,有什么优雅的写法?...