文章链接:https://mp.weixin.qq.com/s/n6EXvfmpNPtWM1kEnGgwUA

摇一摇红包效果已经是老生常谈的了,利用手机的传感器识别摇一摇,同时过程中进行动画+震动+声音的效果。Ps:百度网页版「摇一摇」三个字,会有效果的,皮一哈!

效果图:

摇一摇主要通过SensorManager监听手机,实现 SensorEventListener,在onSensorChanged去判断,根据加速度来判断摇晃的程度。

ShakeSensorListener shakeListener = new ShakeSensorListener();
SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); private class ShakeSensorListener implements SensorEventListener { @Override
public void onSensorChanged(SensorEvent event) {
//避免一直摇
if (isShake) {
return;
}
// 开始动画
anim.start();
float[] values = event.values;
/*
* x : x轴方向的重力加速度,向右为正
* y : y轴方向的重力加速度,向前为正
* z : z轴方向的重力加速度,向上为正
*/
float x = Math.abs(values[0]);
float y = Math.abs(values[1]);
float z = Math.abs(values[2]);
//加速度超过19,摇一摇成功
if (x > 19 || y > 19 || z > 19) {
isShake = true;
//播放声音
playSound(MainActivity.this);
//震动,注意权限
vibrate( 500);
//仿网络延迟操作,这里可以去请求服务器...
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//弹框
showDialog();
//动画取消
anim.cancel();
}
},1000);
}
} @Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}

如果手机一直在摇晃,会不停的调用onSensorChanged ,而我们只想要一次摇一摇的效果,所以加了isShake 字段去判断。 在一次摇一摇事件完成后置false,可以继续摇一摇。

注册监听,同时别忘了取消注册。

@Override
protected void onResume() {
//注册监听加速度传感器
sensorManager.registerListener(shakeListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
super.onResume();
} @Override
protected void onPause() {
//取消注册
sensorManager.unregisterListener(shakeListener);
super.onPause();
}

摇一摇过程可以执行动画效果。

ObjectAnimator anim = ObjectAnimator.ofFloat(imgHand,"rotation",0f,45f,-30f,0f);
anim.setDuration(500);
anim.setRepeatCount(ValueAnimator.INFINITE);

播放声音,这里放在raw 资源文件里的。

private void playSound(Context context) {
MediaPlayer player = MediaPlayer.create(context,R.raw.shake_sound);
player.start();
}

震动效果,这里注意要在AndroidManifest 文件里添加权限 <uses-permission android:name="android.permission.VIBRATE" />

private void vibrate(long milliseconds) {
Vibrator vibrator = (Vibrator)getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(milliseconds);
}

一次摇一摇后,这里在弹框消失后可继续摇一摇。

private void showDialog() {
final AlertDialog mAlertDialog = new AlertDialog.Builder(this).show();
View view = LayoutInflater.from(this).inflate(R.layout.layout_dialog,null);
mAlertDialog.setContentView(view);
mAlertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//这里让弹框取消后,才可以执行下一次的摇一摇
isShake = false;
mAlertDialog.cancel();
}
});
Window window = mAlertDialog.getWindow();
window.setBackgroundDrawable(new ColorDrawable(0x00000000));
}

至此,一套摇一摇效果完成!

github地址:https://github.com/taixiang/shake

欢迎关注我的个人博客:https://www.manjiexiang.cn/

更多精彩欢迎关注微信号:春风十里不如认识你

一起学习,一起进步,欢迎上车,有问题随时联系,一起解决!!!

android 摇一摇+震动+声音效果的更多相关文章

  1. Android摇一摇振动效果Demo

    前言     在微信刚流行的时候,在摇一摇还能用来那啥的时候,我也曾深更半夜的拿着手机晃一晃.当时想的最多的就是.我靠,为神马摇一下须要用这么大的力度,当时我想可能腾讯认为那是个人性的设计.后来才发觉 ...

  2. Android的加速度传感器模拟摇一摇的效果-android学习之旅(66)

    主要介绍一下android的加速传感器的简单用法,模拟摇一摇 ,如果x,y,z三个方向的加速度超过了15,就会弹出Toast,当然你可以设置更复杂的策略,比如判断间隔 代码如下 public clas ...

  3. 玩转Android之加速度传感器的使用,模仿微信摇一摇

    Android系统带的传感器有很多种,最常见的莫过于微信的摇一摇了,那么今天我们就来看看Anroid中传感器的使用,做一个类似于微信摇一摇的效果. OK ,废话不多说,我们就先来看看效果图吧: 当我摇 ...

  4. Android 摇一摇之双甩功能

    Android 摇一摇之双甩功能 最近做一个摇一摇的功能 网上相关代码很多 但是这次的需求有点奇葩 要求是摇两次才生效 看起来好像很简单 但真正要做遇到的问题还是很多 时间限制 机型灵敏性 摇动的方式 ...

  5. iOS摇一摇功能、震动功能、简单的摇动动画、生成二维码图片与发送短信等几个功能

    有一个开锁的功能,具体的需求就类似于微信的"摇一摇"功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最 ...

  6. iOS几个功能:1.摇一摇;2.震动;3.简单的摇动动画;4.生成二维码图片;5.发送短信;6.播放网络音频等

    有一个开锁的功能,具体的需求就类似于微信的“摇一摇”功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最简单的功能了. 在v ...

  7. Android 摇一摇 之 传感器片

    要监视原始的传感器数据,你需要实现两个通过SensorEventListener接口暴露的回调方法:onAccuracyChanged()和onSensorChanged(). 传感器数据的速度值,这 ...

  8. android手电筒(摇一摇也可开启手电筒)

    package com.firefly.myflashlight; import android.app.Activity; import android.hardware.Camera; impor ...

  9. Android仿iPhone晃动撤销输入功能(微信摇一摇功能)

    重力传感器微信摇一摇SensorMannager自定义alertdialogSensorEventListener 很多程序中我们可能会输入长文本内容,比如短信,写便笺等,如果想一次性撤销所有的键入内 ...

随机推荐

  1. Redis的7个应用场景

    一:缓存——热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了 ...

  2. 养成这8个编程习惯,你的Python性能将蹭蹭蹭地往上涨

    Python不以性能见长,但掌握一些技巧,也可尽量提高程序性能,避免不必要的资源浪费. 1. 使用局部变量 尽量使用局部变量代替全局变量:便于维护,提高性能并节省内存. 使用局部变量替换模块名字空间中 ...

  3. Kubernetes---Pod的扩容和缩容

    用RC的Scale机制来实现Pod的扩容和缩容 把redis-slave的pod扩展到3个  ,  kubectl scale rc redis-slave --replicas=3 现在来缩容,把 ...

  4. Spotlight监控Oracle--Spotlight On Oracle安装和使用

    网上找了很久,发现单独Spotlight On Oracle的安装包很少,要么要积分C币的,要么官网要授权的. 应用过程中也没有一个集安装与运用与一体的文档,故汇总相关信息,供参考. Spotligh ...

  5. Shiro中的授权问题(二)

    上篇博客(Shiro中的授权问题 )我们介绍了Shiro中最最基本的授权问题,以及常见的权限字符的匹配问题.但是这里边还有许多细节需要我们继续介绍,本节我们就来看看Shiro中授权的一些细节问题. 验 ...

  6. gradle插件从3.2.0升级到3.2.1后报错Error: Cannot create directory 项目目录\thirdlib\build\intermediates\packaged_res\debug\drawable

    报错信息如下:  解决方案: 删除thirdlib\build目录,然后重新编译. 但是紧接着又会报类似的错误,只不过build目录变成其他module的了. 所以,先clear build,然后再重 ...

  7. MyEclipse 新手使用教程---图文详解

    引言 某天在群里看到有小伙伴问MyEclipse/Eclipse的一些使用问题,虽然在我看来,问的问题很简单,但是如果对于刚刚学习的人来说,可能使用就不那么友好了.毕竟我在开始使用MyEclipse/ ...

  8. [软件开发技巧]·树莓派极简安装OpenCv

    树莓派极简安装OpenCv 个人主页–> https://xiaosongshine.github.io/ 因为最近在开发使用树莓派+usb摄像头识别模块,打算用OpenCv,发现网上的树莓派O ...

  9. [NewLife.XCode]对象字典缓存(百万军中取敌首级)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  10. SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......

    SmartSql Why 拥抱 跨平台 DotNet Core,是时候了. 高性能.高生产力,超轻量级的ORM.156kb (Dapper:168kb) So SmartSql TargetFrame ...