1. 程式人生 > >Android .感測器仿微信搖一搖

Android .感測器仿微信搖一搖

佈局檔案:

<LinearLayout
    android:background="@drawable/shakehideimg_man2"
    android:layout_gravity="center"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
        <ImageView
            android:id="@+id/up"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:background="@drawable/shake_logo_up"/>
        <ImageView
            android:id="@+id/down"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:background="@drawable/shake_logo_down"/>
</LinearLayout>

 

如圖:

核心程式碼:

1.建立服務(感測器+震動)

2.設定音樂池

3.如果搖動手機,則進行判斷實現動畫,translayout+震動+音樂播放操作

public class sendFeelThing_three extends Fragment {
    @BindView(R.id.up)
    ImageView up;
    @BindView(R.id.down)
    ImageView down;
    Unbinder unbinder;
    SoundPool mSoundPool;
    int load;
    SensorManager sensorManager;
    SensorEventListener sensorEventListener;
    Vibrator vibrator;

    @SuppressLint("ServiceCast")
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.sendfeelthings_3, null);
        unbinder = ButterKnife.bind(this, view);
        //音樂池:
        mSoundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        load = mSoundPool.load(getActivity(), R.raw.awe, 1);

        /**
         * 感測器:
         * 1.獲取服務:
         * 2.獲取裝置所有的感測器的型別:
         * 3.1、獲取到加速度感測器
         */

        sensorManager= (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
        vibrator= (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);

        //獲取震動伺服器:
        //初始化SoundPool

        /**
         * 感測器監聽器:
         */
         sensorEventListener=new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                float[] values = event.values;
                float xValues = Math.abs(values[0]);
                float yValues = Math.abs(values[1]);
                float zValues = Math.abs(values[2]);

                //表示加速度:
                    if (xValues > 15 || yValues > 15 || zValues > 15) {
                    //新增震動
                    long[] pattern = {300,500};
                    vibrator.vibrate(pattern,-1);



                    mSoundPool.play(load,1.0f,1.0f,1,0,1.0f);
                    getAnimation();
                }
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {

            }
        };
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        Sensor defaultSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(sensorEventListener,defaultSensor,SensorManager.SENSOR_DELAY_GAME);
    }

    //登出SensorManger:
    @Override
    public void onPause() {
        super.onPause();
        sensorManager.unregisterListener(sensorEventListener);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
    public void getAnimation(){
        //動畫:
        Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.up);
        animation.setFillBefore(true);
        up.startAnimation(animation);

        Animation animation1 = AnimationUtils.loadAnimation(getActivity(), R.anim.down);
        animation.setFillBefore(true);
        down.startAnimation(animation1);
    }
}

效果如下: