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

来源:互联网 发布:天刀阿暖捏脸数据 编辑:程序博客网 时间:2024/06/06 05:17

模仿微信摇一摇.使用传感器轻松实现摇一摇效果.
这里使用加速度传感器,分别在设备的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);       }}

这里写图片描述

0 0
原创粉丝点击