android 搖一搖+震動+聲音效果

來自專欄佛戲程序猿

文章鏈接:mp.weixin.qq.com/s/n6EX

搖一搖紅包效果已經是老生常談的了,利用手機的感測器識別搖一搖,同時過程中進行動畫+震動+聲音的效果。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 文件里添加許可權 <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地址:github.com/taixiang/sha

歡迎關注我的個人博客:manjiexiang.cn/

更多精彩歡迎關注微信號:春風十里不如認識你

一起學習,一起進步,歡迎上車,有問題隨時聯繫,一起解決!!!

weixin.qq.com/r/4UgRCQv (二維碼自動識別)

推薦閱讀:

查看原文 >>
相关文章