安卓系统中实现摇一摇画面振动效果的方法
前言
在微信刚流行的时候,在摇一摇还能用来那啥的时候,我也曾深更半夜的拿着手机晃一晃。当时想的最多的就是,我靠,为神马摇一下需要用这么大的力度,当时我想可能腾讯觉得那是个人性的设计,后来才发觉尼马重力加速度设得太高了吧。扯多了,最近项目里需要解决一个振动的问题,因此在学习振动实现的过程中,写了个demo实现了摇一摇振动的效果,这里记录一下。
原理
摇一摇功能的基本原理就是:利用手机的加速度传感器,当加速度到达某个值时,触发某个事件,例如手机振动、ui改变等。这里要实现该功能,首先需要了解一下android传感器的使用。
android传感器sensor使用
android中有多种传感器,目前android sdk支持的传感器包括:加速度传感器、光线传感器、陀螺仪传感器、重力传感器、方向传感器、磁场传感器、压力传感器等。但是并不是所有手机都具有这些传感器的,因为传感器需要money,因此廉价的手机会选择常用的传感器来添加,而且一些高端机型则基本上具有大多数传感器。
sensor使用步骤
android传感器的使用步骤大致可分为三步:
1. 获取传感器管理服对象 sensormanager。
2. 创建传感器事件监听类,该类必须实现android.hardware.sensoreventlistener接口。
3. 使用sensormanager.registerlistener方法注册指定的传感器。
传感器事件接口
sensoreventlistener接口,该接口的onsensorchanged()和onaccuracychanged()方法用于处理相应的传感器事件。
public interface sensoreventlistener { /** * called when sensor values have changed. * <p>see {@link android.hardware.sensormanager sensormanager} * for details on possible sensor types. * <p>see also {@link android.hardware.sensorevent sensorevent}. * * <p><b>note:</b> the application doesn't own the * {@link android.hardware.sensorevent event} * object passed as a parameter and therefore cannot hold on to it. * the object may be part of an internal pool and may be reused by * the framework. * * @param event the {@link android.hardware.sensorevent sensorevent}. */ public void onsensorchanged(sensorevent event); /** * called when the accuracy of a sensor has changed. * <p>see {@link android.hardware.sensormanager sensormanager} * for details. * * @param accuracy the new accuracy of this sensor */ public void onaccuracychanged(sensor sensor, int accuracy); }
android振动实现
android振动效果实现主要是依靠vibrator服务,具体调用方法如下代码所示:
import android.app.activity; import android.app.service; import android.os.vibrator; public class vibratorhelper { public static void vibrate(final activity activity, long milliseconds) { vibrator vibrator = (vibrator) activity .getsystemservice(service.vibrator_service); vibrator.vibrate(milliseconds); } public static void vibrate(final activity activity, long[] pattern, boolean isrepeat) { vibrator vibrator = (vibrator) activity .getsystemservice(service.vibrator_service); vibrator.vibrate(pattern, isrepeat ? 1 : -1); } }
同时,还需要在androidmanifest.xml里增加振动权限:
<uses-permission android:name="android.permission.vibrate"/>
解释一下vibrate方法的参数:
1. long milliseconds:振动的时长,单位是毫秒。
2. long[] pattern:自定义振动模式。数组中数字的含义依次是[静止时长, 振动时长, 静止时长, 振动时长, ......]。振动时长的单位是毫秒。
3. repeat:是否重复振动,1为重复,-1为只振动一次。
摇一摇振动demo实现
好了,了解了摇一摇需要借助加速度传感器,振动需要借助vibrator服务,那就直接来写代码了。mainactivity类实现如下:
import android.app.activity; import android.app.alertdialog; import android.content.context; import android.content.dialoginterface; import android.content.dialoginterface.onclicklistener; import android.hardware.sensor; import android.hardware.sensorevent; import android.hardware.sensoreventlistener; import android.hardware.sensormanager; import android.os.bundle; import android.util.log; import android.widget.toast; public class mainactivity extends activity { private sensormanager sensormanager; private sensoreventlistener shakelistener; private alertdialog.builder dialogbuilder; private boolean isrefresh = false; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); sensormanager = (sensormanager) getsystemservice(context.sensor_service); shakelistener = new shakesensorlistener(); dialogbuilder = new alertdialog.builder(this); dialogbuilder.setpositivebutton("确定", new onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { isrefresh = false; dialog.cancel(); } }).setmessage("摇到了一个漂亮妹子!").create(); } @override protected void onresume() { sensormanager.registerlistener(shakelistener, sensormanager.getdefaultsensor(sensor.type_accelerometer), sensormanager.sensor_delay_fastest); super.onresume(); } @override protected void onpause() { // acitivity后台时取消监听 sensormanager.unregisterlistener(shakelistener); super.onpause(); } private class shakesensorlistener implements sensoreventlistener { private static final int accelerate_value = 20; @override public void onsensorchanged(sensorevent event) { // log.e("zhengyi.wzy", "type is :" + event.sensor.gettype()); // 判断是否处于刷新状态(例如微信中的查找附近人) if (isrefresh) { return; } float[] values = event.values; /** * 一般在这三个方向的重力加速度达到20就达到了摇晃手机的状态 x : x轴方向的重力加速度,向右为正 y : * y轴方向的重力加速度,向前为正 z : z轴方向的重力加速度,向上为正 */ float x = math.abs(values[0]); float y = math.abs(values[1]); float z = math.abs(values[2]); log.e("zhengyi.wzy", "x is :" + x + " y is :" + y + " z is :" + z); if (x >= accelerate_value || y >= accelerate_value || z >= accelerate_value) { toast.maketext( mainactivity.this, "accelerate speed :" + (x >= accelerate_value ? x : y >= accelerate_value ? y : z), toast.length_short).show(); vibratorhelper.vibrate(mainactivity.this, 300); isrefresh = true; dialogbuilder.show(); } } @override public void onaccuracychanged(sensor sensor, int accuracy) { // todo auto-generated method stub } } }
效果图:
上一篇: 4种java复制文件的方式
下一篇: 用扩展方法优化多条件查询(不定条件查询)