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

本文详细介绍了如何在Android中利用传感器实现摇一摇功能,并结合Vibrator服务实现震动效果。同时,文章讲解了如何通过MediaPlayer类播放音频文件,遵循正确的生命周期管理。内容包括SensorManager的使用、Sensor类、SensorEvent类和SensorEventListener接口的详解,以及Vibrator的vibrate()和cancel()方法,以及MediaPlayer的create()和start()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先我们要知道摇一摇的使用是应用传感器来实现的:

前言了解:

传感器
一、传感器的类的结构:
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" /> <!--设置震动的权限 -->

后续工作呢!就自己做了啊!  就是添加一个简单动画效果以及显示弹窗什么的.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值