一、首先我们要知道摇一摇的使用是应用传感器来实现的:
前言了解:
传感器
一、传感器的类的结构:
1.包:android.hardware
2.SensorManager类:传感器的服务类
实例化:context.getSystemService(String name)
方法:
1)、Sensor getDefaultSensor(int type)
根据传感器的类型获取具体的传感器的对象:
参数:type传感器的类型
值:Sensor.TYPE_ACCELEROMETER:加速传感器
2)、registerListener(SensorEventListener listener,Sensor sensor,int rate) 注册传感器
参数: listener:传感器事件的监听事件
sensor:具体的传感器
rate:数据延误的时间
值:SENSOR_DELAY_FASTEST:延迟时间0微妙
SENSOR_DELAY_GAME:延迟时间20000微妙
SENSOR_DELAY_UI:延迟时间66667微妙
SENSOR_DELAY_NORMAL:延迟的时间2000000微妙
3.unregisterListener(SensorEventListener listener,Sensor sensor) 取消注册
参数:listener:事件
sensor:具体传感器的对象
二、Sensor类:代表的是具体的传感器,获取传感器的信息
三、SensorEvent类:代表的是传感器的事件
四、sensorEventListener接口:代表的是传感器的监听事件
震动效果
一、vibrator类:震动的服务类
实例化:context.getSystemService(java.lang.Stirng)
方法:
1、vibrate(long [] pattern,int repeat)
参数:pattern:设置震动的时间间隔和持续时间
repeat:设置震动重复的次数
2、cancel():取消震动
音乐设置
二、mediaPlayer类:播放音频和视频文件
实例化方式:
1.静态方法:static MediaPlayer create(Context context,int resid) 根据音频文件的标识得到MediapLlayer对象
2.构造方法:1.mediaPlayer()方法:
1.setDataSource(FileDescriptor fd,long offset,int length) 设置音频文件资源
参数:fd:音频文件
offest:初始偏移量
length:音频文件长度
注意:严格按照生命周期进行实现
方法:1.start():播放音频文件
二、代码分析:
1、创建一个ShakeSensor的传感器类实现SensorEventListener接口:
/**
* Created by Administrator on 2016/12/29.
* 实现传感器-加速度传感器
* @author diaobao-刘平
*/
public class ShakeSensor implements SensorEventListener {
public ShakeSensor() {
}
private static final String TAG = "ShakeSensor";
private static final int SPEED_SHRESHOLD = 4800;
private Context mContext;
private SensorManager mSensorManager;
private Sensor mSensor; //加速度传感器
private long last_time; //记录的最后的时间
private float last_x;//记录最后一次的值
private float last_y;//记录最后一次的值
private float last_z;//记录最后一次的值
private OnshakeListener mOnShakeListener;
public ShakeSensor(Context context) {
mContext = context;
}
public void init() {
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//注册传感器
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_FASTEST);
}
public void unRegisterListener() {
mSensorManager.unregisterListener(this, mSensor);
}
@Override
public void onSensorChanged(SensorEvent event) {
long currentIime = System.currentTimeMillis();
if (currentIime - last_time > 10) {
//两次摇动的时间间隔
long timeDistance = currentIime - last_time;
last_time = currentIime;
//当前值
float x = event.values[0]; //x轴变化的值
float y = event.values[1]; //y轴变化的值
float z = event.values[2]; //z轴变化的值
Log.e(TAG, "onSensorChanged: x+" + x + "'--" + y + "--" + z);
double speed; //速度的阈值
double absValue = Math.abs(x + y + z - last_x - last_y - last_z);
speed = absValue / timeDistance * 10000;
if (speed > SPEED_SHRESHOLD) {
//当xyz轴的值达到一定的值是进行后续的操作
if (null != mOnShakeListener) {
mOnShakeListener.onShake();
}
}
last_x = x;
last_y = y;
last_z = z;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
public void setOnShakeListener(OnshakeListener onShakeListener) {
mOnShakeListener = onShakeListener;
}
public interface OnshakeListener {
void onShake();
}
}
2、在activity中调用方法设置以及实现简单的震动和播放音频文件:注意这里的音频文件是放在raw目录下的
public class MainActivity extends AppCompatActivity implements ShakeSensor.OnshakeListener {
private ShakeSensor mShakeSensor;
private Vibrator vibrator; //设置震动
private MediaPlayer mediaPlayer; //设置音频
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mShakeSensor = new ShakeSensor(this);
//注册一个回调事件
mShakeSensor.setOnShakeListener(this);
mShakeSensor.init();
}
@Override
public void onShake() {
//实现一些操作
Toast t = Toast.makeText(MainActivity.this, "摇一摇成功", Toast.LENGTH_SHORT);
t.setGravity(Gravity.CENTER, 0, 0); //设置位置
t.show();
SetYinping();
}
private void setZhendong() {
/*
* 想设置震动大小可以通过改变pattern来设定,如果开启时间太短,震动效果可能感觉不到
*方法:vibrate(long [] pattern,int repeat)
参数:pattern:设置震动的时间间隔和持续时间
repeat:设置震动重复的次数
* */
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
long[] pattern = {100, 400, 100, 400}; // 停止 开启 停止 开启
vibrator.vibrate(pattern, 2); //重复两次上面的pattern 如果只想震动一次,index设为-1
}
private void SetYinping() {
mediaPlayer = MediaPlayer.create(this, R.raw.dd);
mediaPlayer.start();
// SoundPool soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
// int load = soundPool.load(this, R.raw.dd, 1);
}
public void onStop() {
super.onStop();
vibrator.cancel(); //取消震动
mediaPlayer.stop();
}
//设置取消的按钮点击事件
public void onClick(View v) {
// vibrator.cancel(); //取消震动
// mediaPlayer.stop();//音频暂停
}
}
3、添加震动权限:
<uses-permission android:name="android.permission.VIBRATE" /> <!--设置震动的权限 -->
后续工作呢!就自己做了啊! 就是添加一个简单动画效果以及显示弹窗什么的.......