使用传感器实现仿微信摇一摇

模仿微信摇一摇.使用传感器轻松实现摇一摇效果.
这里使用加速度传感器,分别在设备的x,y,z三维空间坐标取定值(摇的范围不要太大)

public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private TextView sensor;
    private SensorManager sensorManager;
    private ImageView up_logo, down_logo;
    //控制音乐
    private SoundPool soundPool;
    private int soundPool_id;
    //震动
    private Vibrator vibrator;

    // private
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensor = (TextView) findViewById(R.id.text_sensor);


        //SensorManager 管理着当前设备上的所有传感器  是基于系统服务的
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        //获取当前设备的所有传感器
        List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
        StringBuilder builder = new StringBuilder();
        builder.append("传感器总数" + sensorList.size() + "\n");
        for (int i = 0; i < sensorList.size(); i++) {
            Sensor sensor = sensorList.get(i);
            builder.append("传感器名称:" + sensor.getName() + "\n" + "传感器厂商:" + sensor.getVendor() + "\n");
        }
        sensor.setText(builder);


        
        initView();
        //音乐
        initSoundPool();
        //震动
        initVibrator();

    }
      @Override
    protected void onStart() {
        super.onStart();
        //设置传感器的监听,加速传感器
        initSensor();
    }这里写图片描述

    private void initSensor() {
        Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        //通过SensorManager来实现监听加速传感器
        sensorManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_UI);

    }

    private void initVibrator() {
        vibrator = (Vibrator) this.getSystemService(VIBRATOR_SERVICE);
    }

    private void initSoundPool() {
        //参数三没有意义.相当于保留字段
            if (Build.VERSION.SDK_INT >= 21) {
            SoundPool.Builder builder = new SoundPool.Builder();
            //设置
            builder.setMaxStreams(1);//音乐的个数
            AudioAttributes attributs = new AudioAttributes.Builder()
                    .setLegacyStreamType(AudioManager.STREAM_MUSIC)
                    .build();
            builder.setAudioAttributes(attributs);
            soundPool = builder.build();
        } else {
            soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        }
        //添加音乐
        //参数三是音乐池中音乐播放的优先级
        soundPool_id = soundPool.load(this, R.raw.awe, 1);

    }

    private void initView() {
        up_logo = (ImageView) findViewById(R.id.image1);
        down_logo = (ImageView) findViewById(R.id.image2);
    }

    //数据发生变化
    @Override
    public void onSensorChanged(SensorEvent event) {
        Sensor sensor = event.sensor;
        int type = sensor.getType();
        switch (type) {
            case Sensor.TYPE_ACCELEROMETER://加速传感器
                float[] values = event.values;
                float x = values[0];
                float y = values[1];
                float z = values[2];
                if (Math.abs(x) > 30 || Math.abs(y) > 30 || Math.abs(z) > 30) {
                    //触发摇一摇

                    //音乐播放
                    /**
                     * @param soundID a soundID returned by the load() function
                     * @param leftVolume left volume value (range = 0.0 to 1.0)//左声道
                     * @param rightVolume right volume value (range = 0.0 to 1.0)//右声道
                     * @param priority stream priority (0 = lowest priority)
                     * @param loop loop mode (0 = no loop, -1 = loop forever)
                     * @param rate playback rate (1.0 = normal playback, range 0.5 to 2.0)
                     * @return non-zero streamID if successful, zero if failed
                     * */
                    soundPool.play(soundPool_id, 1, 1, 0, 0, 1);
                    //震动
                    vibrator.vibrate(new long[]{200, 300, 400, 200}, -1);
                    //执行动画
                    initAnimation();
                }
                break;
            default:
                break;
        }
    }

    private void initAnimation() {
        // 来个动画集合
        AnimationSet set_up = new AnimationSet(true);
        TranslateAnimation up_up = new TranslateAnimation(
                TranslateAnimation.RELATIVE_TO_SELF, 0,//x轴起点
                TranslateAnimation.RELATIVE_TO_SELF, 0,//x轴终点
                TranslateAnimation.RELATIVE_TO_SELF, 0,//y轴起点
                TranslateAnimation.RELATIVE_TO_SELF, -1//y轴终点
        );
        up_up.setDuration(1000);

        TranslateAnimation up_down = new TranslateAnimation(
                TranslateAnimation.RELATIVE_TO_SELF, 0,//x轴起点
                TranslateAnimation.RELATIVE_TO_SELF, 0,//x轴终点
                TranslateAnimation.RELATIVE_TO_SELF, -1,//y轴起点
                TranslateAnimation.RELATIVE_TO_SELF, 0//y轴终点
        );
        up_down.setDuration(1000);


        //延迟执行set中的某一个动画
        up_down.setStartOffset(500);

        set_up.addAnimation(up_up);//移动上去
        set_up.addAnimation(up_down);//拉下来
        up_logo.startAnimation(set_up);

        

        AnimationSet set_down = new AnimationSet(true);
        TranslateAnimation down_down = new TranslateAnimation(
                TranslateAnimation.RELATIVE_TO_SELF, 0,//x轴起点
                TranslateAnimation.RELATIVE_TO_SELF, 0,//x轴终点
                TranslateAnimation.RELATIVE_TO_SELF, 0,//y轴起点
                TranslateAnimation.RELATIVE_TO_SELF, 1//y轴终点
        );
        down_down.setDuration(1000);

        TranslateAnimation down_up = new TranslateAnimation(
                TranslateAnimation.RELATIVE_TO_SELF, 0,//x轴起点
                TranslateAnimation.RELATIVE_TO_SELF, 0,//x轴终点
                TranslateAnimation.RELATIVE_TO_SELF, 1,//y轴起点
                TranslateAnimation.RELATIVE_TO_SELF, 0//y轴终点
        );
        down_up.setDuration(1000);

        set_down.addAnimation(down_down);//向下移动
        set_down.addAnimation(down_up);//往上拉动
        down_logo.startAnimation(set_down);

    }

    //精度发生变化,传感器,该方法用不到
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    protected void onStop() {
        super.onStop();
        sensorManager.unregisterListener(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除注册
        sensorManager.unregisterListener(this);
       }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值