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

文章連接: https://mp.weixin.qq.com/s/n6EXvfmpNPtWM1kEnGgwUA

搖一搖紅包效果已是老生常談的了,利用手機的傳感器識別搖一搖,同時過程當中進行動畫+震動+聲音的效果。Ps:百度網頁版「搖一搖」三個字,會有效果的,皮一哈!
效果圖: android

搖一搖主要經過SensorManager監聽手機,實現 SensorEventListener,在onSensorChanged去判斷,根據加速度來判斷搖晃的程度。git

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,能夠繼續搖一搖。 github

註冊監聽,同時別忘了取消註冊。服務器

@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" />ide

private void vibrate(long milliseconds) {
    Vibrator vibrator = (Vibrator)getSystemService(Service.VIBRATOR_SERVICE);
    vibrator.vibrate(milliseconds);
}

一次搖一搖後,這裏在彈框消失後可繼續搖一搖。post

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/

更多精彩歡迎關注微信號:春風十里不如認識你
一塊兒學習,一塊兒進步,歡迎上車,有問題隨時聯繫,一塊兒解決!!!

相關文章
相關標籤/搜索