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