android 摇一摇+震动+声音效果

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 文件里添加权限

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));
}
至此,一套摇一摇效果完成!


历经千帆,归来仍少年!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值