欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android利用传感器仿微信摇一摇功能

程序员文章站 2023-11-27 12:33:34
传感器 简单的介绍一下传感器: 就是设备用来感知周边环境变化的硬件。 android中的传感器包含在传感器框架中,属于android.hardware.*(硬件部分...

传感器

简单的介绍一下传感器:
就是设备用来感知周边环境变化的硬件。

android中的传感器包含在传感器框架中,属于android.hardware.*(硬件部分)

传感器框架主要包含四个部分:

① sensormanager:用来获取传感器的入口,它是一个系统的服务,还可以为传感器注册与取消注册监听
② sensor: 具体的传感器,包含了传感器的名字,类型,采样率
③ sensorevent:传感器事件,包含了传感器采集回来的数据,传感器的精度
④ sensoreventlistener:传感器的监听,主要监测传感器数据变化,精度变化…

android播放音频系统提供了两种方式

① mediaplayer 播放常规的音频,视频,通常用在播放器上
② soundpool 声音池,通常用在小而频繁播放的音乐,需要同时播放多个音乐的

vibrate 所震动传感器需要添加权限

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

实现之前先来看看手机上的传感器有哪些?(此处可以略过…)
oncreat();中设置textview

sensor = (textview) findviewbyid(r.id.sensor);

    msensormanager = (sensormanager) getsystemservice(context.sensor_service);

    list<sensor> sensorlist = msensormanager.getsensorlist(sensor.type_all);

    stringbuilder builder = new stringbuilder();

    builder.append("传感器总数: "+sensorlist.size()+"\n");
    for (int i = 0; i < sensorlist.size(); i++) {
      sensor sensor = sensorlist.get(i);
      builder.append("传感器名称: "+sensor.getname()+", 传感器生产厂商: "+sensor.getvendor()+"\n");
    }
    sensor.settext(builder.tostring());

惊奇的发现小米5上竟然有41个传感器,可以哈…厉害了
好了,好了接下来言归正传—微信摇一摇

界面的话三张图片你的层叠,relativelayout进行布局

Android利用传感器仿微信摇一摇功能

在oncreate中封装的方法

//摇一摇---->加速传感器
    //1、初始化控件
    initview();
    //2、初始化音乐soundpool
    initsoundpool();
    //3、震动
    initvibrator();

上面盖的两张图片初始化

up_logo = (imageview) findviewbyid(r.id.up_logo);
down_logo = (imageview) findviewbyid(r.id.down_logo);

在初始化soundpool的时候,发现new soundpool已经不推荐使用了,新版的(api>21)使用builder构建,所以在这里使用版本进行判断了一下

private void initsoundpool() {
    if(build.version.sdk_int>=21){
      soundpool.builder builder = new soundpool.builder();
      //设置
      builder.setmaxstreams(1);
      audioattributes attributes = new audioattributes.builder()
          .setlegacystreamtype(audiomanager.stream_music)
          .build();

      builder.setaudioattributes(attributes);

      msoundpool = builder.build();
    }else {
      //已经过时,老版本
      msoundpool = new soundpool(1, audiomanager.stream_music, 0);//参数三保留参数
    }
    //添加音乐
    //参数三是音乐池中音乐播放的优先级
    msoundpool_id = msoundpool.load(this, r.raw.awe, 1);
  }

初始化振动器:(是一个系统的服务)

mvibrator = (vibrator) this.getsystemservice(vibrator_service);

摇一摇利用的是加速度传感器,需要监听它的变化状态
sensormanager的注册也是成对出现的

 @override
  protected void onstart() {
    super.onstart();
    //4、设置传感器监听,加速传感器
    initsensor();
  }

  @override
  protected void onstop() {
    super.onstop();
    //解除注册
    msensormanager.unregisterlistener(this);
  }

  private void initsensor() {
    sensor accelerometersensor = msensormanager.getdefaultsensor(sensor.type_accelerometer);
    //通过sensormanager实现监听加速传感器
    msensormanager.registerlistener(this,accelerometersensor,sensormanager.sensor_delay_ui);
  }

这里的监听需要手动去实现(这里是比较不智能的…)
implements sensoreventlistener会实现两个方法

//数据发生变化
 @override
  public void onsensorchanged(sensorevent event) {

  }

//精度发生变化,传感器的,该方法用不到
  @override
  public void onaccuracychanged(sensor sensor, int accuracy) {

  }

下面是方法的具体实现:

@override
  public void onsensorchanged(sensorevent event) {//数据发生变化
    sensor sensor = event.sensor;
    int type = sensor.gettype();
    switch (type){
      case sensor.type_accelerometer://加速传感器

        float[] values = event.values;
        //x,y,z 三个方向
        //9.8
        float x = values[0];
        float y = values[1];
        float z = values[2];

        if(math.abs(x)>25||math.abs(y)>25||math.abs(z)>25){
          //触发摇一摇
          //音乐播放
          msoundpool.play(msoundpool_id,1,1,0,0,1);

          //震动(-1代表只执行一次)
          mvibrator.vibrate(new long[]{200,300,400,200},-1);
          //动画执行
          initanimation();
        }
        break;
    }
  }

动画没什么好解释的,直接上代码了

private void initanimation() {
  //up_logo 向上移动,同时有上下震动
  animationset set_up = new animationset(true);
  translateanimation up_up = new translateanimation(
    translateanimation.relative_to_self,0,//x轴起点
    translateanimation.relative_to_self,0,//x轴终点
    translateanimation.relative_to_self,0,//y轴起点
    translateanimation.relative_to_self,-1//y轴终点
    );

  up_up.setduration(1000);

  translateanimation up_down = new translateanimation(
    translateanimation.relative_to_self,0,//x轴起点
    translateanimation.relative_to_self,0,//x轴终点
    translateanimation.relative_to_self,-1,//y轴起点
    translateanimation.relative_to_self,0//y轴终点
  );
  up_down.setduration(1000);

  //延迟执行set中的某一动画
  up_down.setstartoffset(500);
  set_up.addanimation(up_up);//移动上去;
  set_up.addanimation(up_down);//拉下来
  up_logo.startanimation(set_up);

//----------

  animationset set_down = new animationset(true);
  translateanimation down_down = new translateanimation(
    translateanimation.relative_to_self,0,//x轴起点
    translateanimation.relative_to_self,0,//x轴终点
    translateanimation.relative_to_self,0,//y轴起点
    translateanimation.relative_to_self,1//y轴终点
  );
  down_down.setduration(1000);
  translateanimation down_up = new translateanimation(
    translateanimation.relative_to_self,0,//x轴起点
    translateanimation.relative_to_self,0,//x轴终点
    translateanimation.relative_to_self,1,//y轴起点
    translateanimation.relative_to_self,0//y轴终点
  );
  down_up.setduration(1000);
  down_up.setstartoffset(500);
  set_down.addanimation(down_down);//向下移动
  set_down.addanimation(down_up);//往上拉动
  down_logo.startanimation(set_down);

 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。