一:xml布局:
<ImageView android:id="@+id/im_flower" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@mipmap/shake_flower_img" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/im_up" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@mipmap/shake_logo_up" /> <ImageView android:id="@+id/im_down" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@mipmap/shake_logo_down" /> </LinearLayout>二:activity里面的代码
public class YaoYao extends AppCompatActivity implements SensorEventListener { private ImageView im_flower; private ImageView im_up; private ImageView im_down; private boolean isShake; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: // 添加震动权限 mVibrator.vibrate(300); //发出提示音 mSoundPool.play(mWeiChatAudio, 1, 1, 0, 0, 1); startAnimation(false);//参数含义: (不是回来) 也就是说两张图片分散开的动画 break; case 1: mVibrator.vibrate(300); break; case 2: //整体效果结束, 将震动设置为false isShake = false; // 展示上下两种图片回来的效果 startAnimation(true); break; } } }; private SensorManager sensorManager; private SoundPool mSoundPool; private int mWeiChatAudio; private Vibrator mVibrator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_yao_yao); initView(); initSensor(); } // 初始化控件 private void initView() { im_flower = (ImageView) findViewById(R.id.im_flower); im_up = (ImageView) findViewById(R.id.im_up); im_down = (ImageView) findViewById(R.id.im_down); } // 初始化传感器 private void initSensor() { // 获取传感器管理类对象 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 通过管理类对象获取具体的某一种类型的传感器 Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // 注册监听器(上下文参数、传感器对象) sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME); //初始化SoundPool mSoundPool = new SoundPool(1, AudioManager.STREAM_SYSTEM, 5); // 往音效池中加载一种音效 mWeiChatAudio = mSoundPool.load(this, R.raw.weichat_audio, 1); // 获取Vibrator震动服务 mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); } /** * 开启 摇一摇动画 * * @param isBack 是否是返回初识状态 */ private void startAnimation(boolean isBack) { //动画坐标移动的位置的类型是相对自己的 int type = Animation.RELATIVE_TO_SELF; float topFromY; float topToY; float bottomFromY; float bottomToY; if (isBack) { topFromY = -0.5f; topToY = 0; bottomFromY = 0.5f; bottomToY = 0; } else { topFromY = 0; topToY = -0.5f; bottomFromY = 0; bottomToY = 0.5f; } //上面图片的动画效果 TranslateAnimation topAnim = new TranslateAnimation( type, 0, type, 0, type, topFromY, type, topToY ); topAnim.setDuration(200); //动画终止时停留在最后一帧~不然会回到没有执行之前的状态 topAnim.setFillAfter(true); //底部的动画效果 TranslateAnimation bottomAnim = new TranslateAnimation( type, 0, type, 0, type, bottomFromY, type, bottomToY ); bottomAnim.setDuration(200); bottomAnim.setFillAfter(true); //设置动画 im_up.startAnimation(topAnim); im_down.startAnimation(bottomAnim); } //检测到有一定的加速度的时候 @Override public void onSensorChanged(SensorEvent event) { int type = event.sensor.getType(); if (type == Sensor.TYPE_ACCELEROMETER) { //获取三个方向值 float[] values = event.values; float x = values[0]; float y = values[1]; float z = values[2]; if ((Math.abs(x) > 17 || Math.abs(y) > 17 || Math .abs(z) > 17) && !isShake) { isShake = true; Thread thread = new Thread() { @Override public void run() { super.run(); try { //开始震动 发出提示音 展示动画效果 mHandler.obtainMessage(0).sendToTarget(); Thread.sleep(500); //再来一次震动提示 mHandler.obtainMessage(1).sendToTarget(); Thread.sleep(500); mHandler.obtainMessage(2).sendToTarget(); } catch (InterruptedException e) { e.printStackTrace(); } } }; thread.start(); } } } public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override protected void onPause() { // 务必要在pause中注销 mSensorManager // 否则会造成界面退出后摇一摇依旧生效的bug if (sensorManager != null) { sensorManager.unregisterListener(this); } super.onPause(); } }