Android Studio学习路程(13)

今天在网上学习了几个新的知识点,一个是传感器,一个是添加音效池,一个是实现震动的效果。

首先,安卓有很多自带的传感器,有加速度传感器等等,

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
这个是安卓官方文件给出的一个例子,添加音效池和添加震动的方法是差不多的;下面是一个实现微信摇一摇功能的APP的代码:
技术图片
技术图片

 1 package com.example.hp.wechat_shake; 2  3 import android.content.Intent; 4 import android.os.Bundle; 5 import android.support.v7.app.ActionBarActivity; 6 import android.view.View; 7 import android.widget.Button; 8  9 public class MainActivity extends ActionBarActivity implements View.OnClickListener {10 11 private Button mButton;12 13  @Override14 protected void onCreate(Bundle savedInstanceState) {15 super.onCreate(savedInstanceState);16  setContentView(R.layout.activity_main);17 18 //初始化控件19  initUI();20 21  }22 private void initUI() {23 mButton = (Button) findViewById(R.id.btn_shake);24 findViewById(R.id.btn_shake).setOnClickListener(this);25  }26 27  @Override28 public void onClick(View view) {29 Intent intent = new Intent();30 switch(view.getId()){31 case R.id.btn_shake:32 intent.setClass(this,ShakeActivity.class);33 break;34  }35  startActivity(intent);36  }37 }

MainActivity

技术图片
技术图片

 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4  xmlns:tools="http://schemas.android.com/tools" 5  android:layout_width="match_parent" 6  android:layout_height="match_parent" 7  tools:context="com.example.hp.wechat_shake.MainActivity"> 8  9 <Button10 android:id="@+id/btn_shake"11  android:text="微信摇一摇"12  android:textSize="30dp"13  android:layout_width="match_parent"14  android:layout_height="65dp"/>15 </RelativeLayout>

MainActivity_XML

技术图片
技术图片

 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4  xmlns:tools="http://schemas.android.com/tools" 5  android:layout_width="match_parent" 6  android:layout_height="match_parent" 7  android:background="#000" 8  tools:context="com.example.hp.wechat_shake.ShakeActivity"> 9 10 <ImageView11 android:id="@+id/iv_shake_img"12  android:layout_width="wrap_content"13  android:layout_height="wrap_content"14  android:src="@drawable/shakehideimg_man2"15  android:layout_centerInParent="true"/>16 17 <LinearLayout18 android:id="@+id/id_shake_layout"19  android:layout_width="match_parent"20  android:layout_height="match_parent"21  android:orientation="vertical"22  android:gravity="center">23 24 <ImageView25 android:src="@drawable/shake_logo_up"26  android:id="@+id/iv_shake_up"27  android:layout_width="wrap_content"28  android:layout_height="wrap_content"/>29 30 <ImageView31 android:src="@drawable/shake_logo_down"32  android:id="@+id/iv_shake_down"33  android:layout_width="wrap_content"34  android:layout_height="wrap_content"/>35 36 </LinearLayout>37 38 </RelativeLayout>

ShakeActivity_XML

技术图片
技术图片

 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest package="com.example.hp.wechat_shake" 3  xmlns:android="http://schemas.android.com/apk/res/android"> 4  /*******振动器使用权限**********/ 5 <uses-permission android:name="android.permission.VIBRATE"/> 6  7 <application 8 android:allowBackup="true" 9  android:icon="@mipmap/ic_launcher"10  android:label="@string/app_name"11  android:supportsRtl="true"12  android:theme="@style/AppTheme">13 <activity android:name=".MainActivity">14 <intent-filter>15 <action android:name="android.intent.action.MAIN"/>16 17 <category android:name="android.intent.category.LAUNCHER"/>18 </intent-filter>19 </activity>20 <activity android:name=".ShakeActivity">21 </activity>22 </application>23 24 </manifest>

manifest_XML

技术图片
技术图片

 1 package com.example.hp.wechat_shake; 2  3 import android.content.Context; 4 import android.hardware.Sensor; 5 import android.hardware.SensorEvent; 6 import android.hardware.SensorEventListener; 7 import android.hardware.SensorManager; 8 import android.media.AudioManager; 9 import android.media.SoundPool; 10 import android.os.Bundle; 11 import android.os.Vibrator; 12 import android.support.v7.app.ActionBarActivity; 13 import android.view.animation.Animation; 14 import android.view.animation.AnimationSet; 15 import android.view.animation.TranslateAnimation; 16 import android.widget.ImageView; 17  18 public class ShakeActivity extends ActionBarActivity implements SensorEventListener{ 19  20 private ImageView mShakeImg; 21 private ImageView mShakeUp; 22 private ImageView mShakeDown; 23 private SensorManager mSensorManager; 24 private Sensor mSensor; 25 private AnimationSet mSetUp; 26 private AnimationSet mSetDown; 27 private SoundPool mSoundPool; 28 private int loadId; 29 private Vibrator mVibrator; 30  31  @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34  setContentView(R.layout.activity_shake); 35 //初始化控件 36  initUI(); 37 //初始化动画 38  initAnimation(); 39 //初始化音效池 40  initSoundPool(); 41 //初始化振动器 42  initVibrator(); 43  44  } 45  46 private void initVibrator() { 47 //获取振动器管理者对象 48 mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 49  } 50  51 private void initSoundPool() { 52 //获取音效池对象 53 mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC,0);//2代表音效池最多下载两个播放器,中间的参数代表播放器的类型,最后一个0代表源文件的一个优先级 54 //加载音效到音效池当中 55 loadId=mSoundPool.load(this,R.raw.awe,1); 56  57  } 58  59 private void initUI() { 60 mShakeImg = (ImageView) findViewById(R.id.iv_shake_img); 61 mShakeUp = (ImageView) findViewById(R.id.iv_shake_up); 62 mShakeDown = (ImageView) findViewById(R.id.iv_shake_down); 63 //1.获取传感器管理者对象 64 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 65 //2.获取指定的传感器对象---加速度传感器 66 mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 67 //3.注册传感器对象 68 mSensorManager.registerListener(this,mSensor,SensorManager.SENSOR_DELAY_NORMAL); 69  70  } 71  72  @Override 73 protected void onDestroy() { 74 //4.注销传感器对象 75 super.onDestroy(); 76 mSensorManager.unregisterListener(this); 77  } 78  79  @Override 80 public void onSensorChanged(SensorEvent sensorEvent) { 81 /*当传感器的数值发生改变时会调用的方法(函数)*/ 82 float[] values = sensorEvent.values; 83 float x = values[0]; 84 float y = values[1]; 85 float z = values[3]; 86 int minValue = 12; 87 if(Math.abs(x)>minValue||Math.abs(y)>minValue||Math.abs(z)>minValue){ 88 //开始震动 89 long[]patten = {300,500}; 90 mVibrator.vibrate(patten,-1); 91  92 //开始播放音效 93 mSoundPool.play(loadId,1,1,1,0,1); 94  95  96 //开始动画效果 97  mShakeUp.startAnimation(mSetUp); 98  mShakeDown.startAnimation(mSetDown); 99 100  }101  }102 103  @Override104 public void onAccuracyChanged(Sensor sensor, int i) {105 /*当传感器的精度发生改变时会调用的方法*/106  }107 108 private void initAnimation(){109 //上面图片对应的动画效果110 TranslateAnimation mAnimationUp = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1);111 mAnimationUp.setDuration(500);//设置上面的图片向上的时间为5秒112 TranslateAnimation mAnimationUpDown = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1,Animation.RELATIVE_TO_SELF,0);113 mAnimationUpDown.setDuration(500);114 mSetUp = new AnimationSet(true);115 //将上面的一张图片的上下移动的动画效果放到一个集合里116  mSetUp.addAnimation(mAnimationUp);117  mSetUp.addAnimation(mAnimationUpDown);118 //设置动画之间的执行时间差119 mSetUp.setStartOffset(500);120 121 TranslateAnimation mAnimationDown = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,-1);122 mAnimationDown.setDuration(500);//设置上面的图片向上的时间为5秒123 TranslateAnimation mAnimationDownUp = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,-1,Animation.RELATIVE_TO_SELF,0);124 mAnimationDownUp.setDuration(500);125 mSetDown = new AnimationSet(true);126 //将下面的一张图片的上下移动的动画效果放到一个集合里127  mSetDown.addAnimation(mAnimationDown);128  mSetDown.addAnimation(mAnimationDownUp);129 //设置动画之间的执行时间差130 mSetDown.setStartOffset(500);131 132  }133 }

ShakeActivity

 





相关文章