您的位置:首页 > 其它

摇一摇震动或播放音频案例以及分析详情

2016-12-30 11:00 302 查看
一、首先我们要知道摇一摇的使用是应用传感器来实现的:

前言了解:

传感器

一、传感器的类的结构:

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" /> <!--设置震动的权限 -->


后续工作呢!就自己做了啊!  就是添加一个简单动画效果以及显示弹窗什么的.......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: