博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 摇一摇+震动+声音效果
阅读量:5913 次
发布时间:2019-06-19

本文共 3086 字,大约阅读时间需要 10 分钟。

摇一摇红包效果已经是老生常谈的了,利用手机的传感器识别摇一摇,同时过程中进行动画+震动+声音的效果。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,可以继续摇一摇。

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

@Overrideprotected void onResume() {    //注册监听加速度传感器    sensorManager.registerListener(shakeListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),            SensorManager.SENSOR_DELAY_FASTEST);    super.onResume();}@Overrideprotected 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 文件里添加权限

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://juejin.im/post/5c1a58ce518825079f782c05

你可能感兴趣的文章
httpd
查看>>
php 笔试题汇总
查看>>
能冒泡的事件
查看>>
easyui-tree 修改图标
查看>>
变频电源老化测试重要吗?需要做老化测试吗
查看>>
Linux下Nginx源码安装
查看>>
一文带你快速了解,python是如何解析XML文件
查看>>
如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招
查看>>
云越发展,锁定问题就会越严重?
查看>>
什么样人适合学平面设计?零门槛入门工具收藏
查看>>
用户访问网页的流程原理
查看>>
FastDfs 文件系统迁移
查看>>
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
查看>>
数字格式化工具:Numeral.js 简介
查看>>
Django登录后,自动返回原操作页面的方法
查看>>
UltraEdit批量删除空行
查看>>
运行第一个容器 - 每天5分钟玩转容器技术(4)
查看>>
mysql实现vsftp虚拟用户访问
查看>>
(LNMP) How To Install Linux, nginx, MySQL, PHP
查看>>
write back vs write through
查看>>