近期项目中要求增加摇一摇功能,搜了相关帖子,自己整理一套代码,发个博客保留一份。

解析: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摇一摇功能实现(摇一摇监听)相关推荐

  1. android 摇一摇动画效果,Android实现微信摇一摇功能

    本文实例为大家分享了Android实现微信摇一摇功能的具体代码,供大家参考,具体内容如下 1.初始化界面 设置摇一摇界面的背景图片和摇动时的上下两半张图片 xmlns:tools="http ...

  2. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键

    本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){         ...

  3. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  4. 【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )

    文章目录 一.获取充电状态 二.被动获取充电状态 三.主动获取充电状态 参考 Google 官方文档 : 优化电池续航时间 一.获取充电状态 在应用中执行某些操作 , 如软件云端备份 , 从服务器端获 ...

  5. android 网卡监听,Android实时监听网络的变化

    4中情况.1.无网  2.wifi 3.移动信号 4.网线 BroadcastReceiver netReceiver =new BroadcastReceiver(){ @Override publ ...

  6. android 回退函数,详解React Native监听Android回退按键与程序化退出应用

    详解React Native监听Android回退按键与程序化退出应用 发布时间:2020-09-29 09:25:52 来源:脚本之家 阅读:137 作者:lqh 详解React Native监听A ...

  7. android横竖屏切换布局闪退,Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换...

    在上一篇博客,Android-Activity临时数据的保存,中讲解到,当发生横竖屏切换的时候,系统会杀死Activity并重新启动Activity 系统会杀死Activity 12-12 08:11 ...

  8. android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件

    Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...

  9. android 屏幕方向监听,Android如何监听屏幕旋转

    背景 关于个人,前段时间由于业务太忙,所以一直没有来得及思考并且沉淀点东西:同时组内一个个都在业务上能有自己的思考和总结,在这样的氛围下,不由自主的驱使周末开始写点东西,希望自己除了日常忙于业务,可以 ...

  10. android 拨打电话、 监听来电、监听呼出电话的功能实现

    demo1(通用): 权限 <!-- 监听呼出电话 --> <uses-permission android:name="android.permission.PROCES ...

最新文章

  1. liunx(3)-内核模块编写与系统调用
  2. 单片机中断机制对日常生活的启示_单片机原理与接口技术(高起专)阶段性作业1...
  3. 711 发送请求失败_会不会存在不失败的代理IP?
  4. 日期多选插件Kalendae.js
  5. yum升级CURL到最新版本的方法,非常好用
  6. 6.Composer实现PHP中类的自动加载
  7. 壁纸小程序云开发+无限裂变+附安装视频教程
  8. 社区团购小程序有哪些赚钱方式
  9. docker 安装snipe-it
  10. 30岁的我,裸辞、自甘堕落、重回生活:成功转行Python工程师,月入1W+
  11. c语言实现万年历教程
  12. 级联rc滤波_RC低通,高通滤波电路的基本工作原理
  13. 【英语天天读】优秀的标准
  14. linux关闭内存插槽,linux 统管理中的查看内存插槽数、最大容量和频率
  15. 边下边看 七款P2P下载软件全能大比拼
  16. 蓝筹股有哪些股票 蓝筹股有哪些股票2018
  17. 快速排序 Quick Sort
  18. 第四节 结构化分析方法的概念
  19. 【云计算】云计算四个必学知识看这里
  20. 安装BENQSCANNER 5560驱动与测试扫描

热门文章

  1. linux eclipse web插件,使用Tomcat插件开发WEB应用
  2. chrome 适配调试_移动端适配
  3. 我们自嘲的“码农”身份被官方实锤了!
  4. 皮一皮:唉唉...这钱还没收呢...
  5. 皮一皮:人生就像编程,总有防不胜防的bug会被人发现...
  6. 皮一皮:网络延迟的好处...
  7. 皮一皮:我也想做这样的房东,善解人意、为他人着想...
  8. 每日一皮:只有第一名才能拿金牌...
  9. JWT 入坑爬坑指南
  10. php函数多个参数_php中,用函数,如果有很多个参数,只使用最后一个参数,有什么优雅的写法?...