文章連結: https://mp.weixin.qq.com/s/n6EXvfmpNPtWM1kEnGgwUA
搖一搖紅包效果已經是老生常談的了,利用手機的傳感器識别搖一搖,同時過程中進行動畫+震動+聲音的效果。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/更多精彩歡迎關注微信号:春風十裡不如認識你
一起學習,一起進步,歡迎上車,有問題随時聯系,一起解決!!!