Android传感器—仿照微信摇一摇功能

版权声明:转载请标注原文地址 https://blog.csdn.net/qq_39959838/article/details/80345605

思路分析:

手机摇晃从而发生图片位置的改变,说明要检测手机的晃动,可以通过加速度传感器判断手机的摇晃,图片位置发生改变,然后还会重新回到原来的位置,应该对于图片设置动画。摇一摇当中还包括震动效果和音效,那么我们可以使用震动管理器添加手机震动效果,使用音效池增加背景音乐。

分析了具体实现的功能之后,我们开始按照这些思路,编写代码:

1.绘制布局:activity_shake.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"  
  4.     xmlns:tools="http://schemas.android.com/tools"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:background="#000000">  
  8.     <ImageView  
  9.         android:id="@+id/img_flower"  
  10.         android:src="@mipmap/shakehideimg_man2"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content"  
  13.         android:layout_centerInParent="true"/>  
  14.     <LinearLayout  
  15.         android:id="@+id/img_layout"  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="match_parent"  
  18.         android:orientation="vertical"  
  19.         android:gravity="center">  
  20.         <ImageView  
  21.             android:id="@+id/img_up"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:src="@mipmap/shake_logo_up"/>  
  25.         <ImageView  
  26.             android:id="@+id/img_down"  
  27.             android:layout_width="wrap_content"  
  28.             android:layout_height="wrap_content"  
  29.             android:src="@mipmap/shake_logo_down"/>  
  30.     </LinearLayout>  
  31. </RelativeLayout>  

2.在activity当中编写代码

[java] view plain copy
  1. public class ShakeActivity extends AppCompatActivity {  
  2.     private ImageView iv_flower;  
  3.     private ImageView iv_up;  
  4.     private ImageView iv_down;  
  5. //    声明动画对象  
  6.     private TranslateAnimation upAnimation ,downAnimation;  
  7. //    声明振动器对象  
  8.     private Vibrator vibrator;  
  9.   
  10.     private SensorManager manager;  
  11.     private Sensor sensor;  
  12.   
  13. //    声明放置背景音乐的声音池对象  
  14.     private SoundPool soundPool;  
  15.     private int load;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_shake);  
  21.         iv_flower = (ImageView) findViewById(R.id.img_flower);  
  22.         iv_up = (ImageView) findViewById(R.id.img_up);  
  23.         iv_down = (ImageView) findViewById(R.id.img_down);  
  24. //  1.获取传感器管理者对象  
  25.         manager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);  
  26. //2. 获取传感器对象  
  27.         sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  
  28.         vibrator = (Vibrator)this.getSystemService(Context.VIBRATOR_SERVICE);  
  29.   
  30.         soundPool = new SoundPool(6,AudioManager.STREAM_MUSIC,0);  
  31. //   向声音池当中加载音乐的过程  
  32.          load = soundPool.load(this, R.raw.awe, 1);  
  33.         initAnimation();  
  34.     }  
  35.   
  36.     SensorEventListener listener = new SensorEventListener() {  
  37.         @Override  
  38.         public void onSensorChanged(SensorEvent event) {  
  39.             float[] values = event.values;  
  40.             int coll = 18;  
  41.   
  42.             if (Math.abs(values[0])>18|Math.abs(values[1])>18|Math.abs(values[2])>18){  
  43.                 //开始震动,播放背景音乐,同时播放动画  
  44.                 long pattern[] = {200,400};  
  45.                 vibrator.vibrate(pattern,-1);  
  46. //                播放背景音乐  
  47.                 soundPool.play(load,1.0f,1.0f,1,0,1.0f);  
  48. //                开启动画  
  49.                 iv_up.startAnimation(upAnimation);  
  50.                 iv_down.startAnimation(downAnimation);  
  51.             }  
  52.         }  
  53.         @Override  
  54.         public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  55.         }  
  56.     };  
  57.     @Override  
  58.     protected void onResume() {  
  59.         super.onResume();  
  60. //        注册监听器  
  61.         manager.registerListener(listener,sensor,manager.SENSOR_DELAY_NORMAL);  
  62.     }  
  63.   
  64.     @Override  
  65.     protected void onPause() {  
  66.         super.onPause();  
  67.         manager.unregisterListener(listener);//注销传感器的监听器  
  68.     }  
  69. <span style="white-space:pre;"> </span>//声明动画对象  
  70.     public void initAnimation(){  
  71.         upAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -1);  
  72.         upAnimation.setRepeatCount(1);  
  73.         upAnimation.setRepeatMode(Animation.REVERSE);  
  74.         upAnimation.setDuration(2000);   //上面图片的动画的设置  
  75.   
  76.         downAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF,0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1);  
  77.         downAnimation.setRepeatMode(Animation.REVERSE);  
  78.         downAnimation.setRepeatCount(1);  
  79.         downAnimation.setDuration(2000);//下面图片的动画的设置  
  80.   
  81.     }  
  82. }  

最后要注意的依然是添加手机震动权限

<uses-permission android:name="android.permission.VIBRATE" />


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页