android 摇一摇+震动+声音效果
摇一摇红包效果已经是老生常谈的了,利用手机的传感器识别摇一摇,同时过程中进行动画+震动+声音的效果。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/
更多精彩欢迎关注微信号:春风十里不如认识你
一起学习,一起进步,欢迎上车,有问题随时联系,一起解决!!!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【用 Kotlin 写 Android】有这个必要吗?
前言 Kotlin 被 Android 选为官方支持并推荐的语言满一年了,这一年中可以看见的是 Google 正在大力推广 Kotlin,并且相关的 Kotlin 支持库也频繁更新,可以预见的是在未来一段时间内,Kotlin 会被越来越多的提及,并且也会被越来越多的采用——现在是要深入去研究 Kotlin 的时间了。 不管你喜不喜欢,未来很大可能是 Kotlin 代替 Java,Google 已经决定要这么干了——Android 还是他的亲儿子,那以后 Android 对 Kotlin 的支持会越来越好,你不那么干,只会自讨苦吃,如果没有足够的实力,不要与它作对! Kotlin 确实有很多优秀的特性,没有 Java 语言的历史包袱,包含了很多优秀的编程思想,尤其是 Kotlin 的 函数式编程 的思想,确实让开发更开心了很多。 减少了一些本来就没有那么多必要的模板代码,空指针判断,提高开发效率,这也是最重要的一点。 很多语法糖更接近自然语言。记得我学习编程的时候,最开始学习伪代码,然后脱离伪代码去写 Java,Kotlin 在很多方面比 Java 更接近伪代码,更接近人类自然语言,这是...
- 下一篇
Kotlin 技术书籍集锦-推荐
Kotlin 技术书籍推荐 国内中文书籍: 《Kotlin 极简教程》 编辑推荐 本书由阿里Java程序员撰写,带你快速进入Kotlin世界。本书基于Kotlin 1.1版本,从Kotlin基础知识到动手实战,包含了大量精选示例代码和应用案例。 内容简介 本书从Kotlin的HelloWorld开始,生动讲解Kotlin的基础知识和实战案例,分为两大部分:“基础知识”部分包括语言基础、基本数据类型与类型变量、集合类、泛型、面向对象编程、函数式编程、协程等;“实战”部分包括Kotlin与Java互操作、使用Kotlin集成Spring Boot开发WEB服务端、使用Kotlin集成Gradle开发、使用Kotlin和Anko的Android开发、使用Kotlin DSL、Kotlin文件IO操作与多线程、使用Kotlin Native。本书包含了大量精选示例代码和应用案例,为初学者提供了实用指南,也帮助熟练的Java开发者快速切换到Kotlin。 《Spring Boot 开发实战》(基于 Spring Boot 2.0 和 Kotlin 、Gradle 的企业级开发最佳实践) 本书以案...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7