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

传感器

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

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进行布局

在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);

 }

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

(0)

相关推荐

  • Android利用Sensor(传感器)实现水平仪功能

    这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端. 利用方向传感器返回的第一个参数,实现了一个指南针小应用. 我的Android进阶之旅------>Android利用Sensor(传感器)实现指南针功能 接下来,我们利用返回的第二.三个参数实现该水平仪.因为第二个参数,反映底部翘起的角度(当顶部翘起时为负值),第三个参数可以反映右侧翘起的角度(当左侧翘起时为负值).根据这两个角度就可以开发水平仪,实现手机哪端翘起

  • Android 传感器--光照传感器详解及使用

    Android 设备中有许多传感器,其中有一个传感器控制着你屏幕亮度的变化.当你在很暗的地方使用手机,你设备的屏幕会自动调暗,从而保护你眼睛. 起着这样作用,Android是通过一款光照传感器来获取你周围环境亮度的变化.光照传感器一般在手机的顶部的位置. 要在程序中使用这款传感器 (1)首先要获取SensorManager传感器管理器服务:SensorManager sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERV

  • Android 获取传感器列表整理及简单实例

    Android 获取传感器列表整理及简单实例 Android 4.4 (API等级19)支持以下传感器: TYPE_ACCELEROMETER 加速度传感器,单位是m/s2,测量应用于设备X.Y.Z轴上的加速度 传感器类型值(Sensor Type):1 (0x00000001) TYPE_AMBIENT_TEMPERATURE 温度传感器,单位是℃ 传感器类型值(Sensor Type): 13 (0x0000000d) TYPE_GAME_ROTATION_VECTOR 游戏动作传感器,不收

  • Android利用Sensor(传感器)实现指南针小功能

    首先来说一说该指南针的实现思路: 程序先准备一张指南针图片,该图片上方向指针指向北方.接下来开发一个检测方向的传感器,程序检测到手机顶部绕Z轴转过多少度,让指南针图片反向转多少度即可.由此可见指南针应用只要在界面中添加一张图片,并让图片总是反向转过反向传感器返回的第一个角度值即可. 下面介绍一下方向传感器:方向传感器用于感应手机设备的摆放状态.方向传感器可以返回三个角度,这三个角度即可确定手机的摆放状态.关于方向传感器返回的三个角度的说明如下. 第一个角度:表示手机顶部朝向正北方的夹角.当手机绕

  • Android 重力传感器在游戏开发中的应用

    手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性.本节将继续介绍智能手机的另一种神奇之处:传感器.    一.何为传感器 所谓传感器就是能够探测如光.热.温度.重力.方向等等的装置.    二.Android提供了哪些传感器 1.加速度传感器(重力传感器) 2.陀螺仪传感器 3.光传感器 4.恒定磁场传感器 5.方向传感器 6.恒定的压力传感器 7.接近传感器 8.温度传感器 今天我们给大家介绍的是游戏开发中最最常见

  • Android重力传感器实现滚动的弹球

    熟知: 什么是传感器: 所谓传感器能够探测如光.热.温度.重力.方向 等等的功能! Android中提供传感器有哪些: 1.  加速度传感器(重力传感器)      2.  陀螺仪传感器      3.  光传感器      5.  恒定磁场传感器      6.  方向传感器      7.  恒定的压力传感器      8.  接近传感器      9.  温度传感器 一. 问题描述 Android中有多达11种传感器,不同的手机设备支持的传感器类型也不尽相同 1. 重力传感器 GV-sen

  • android 传感器(OnSensorChanged)使用介绍

    下面是API中定义的几个代表sensor的常量. Int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type. 加速度传感器 int TYPE_ALL A constant describing all sensor types. 所有类型 A constant describing all sensor types. int TYPE_GRAVITY A constant describing a grav

  • Android操作系统介绍之11种传感器

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.接下来通过本文给大家介绍Android操作系统介绍之11种传感器. 在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. #define SENSOR_TYPE_ACCELEROMETER 1 //加速度 #define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力 #define

  • Android编程实现获取所有传感器数据的方法

    本文实例讲述了Android编程实现获取所有传感器数据的方法.分享给大家供大家参考,具体如下: main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" androi

  • Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import an

  • Android利用传感器实现微信摇一摇功能

    本文实例为大家分享了Android微信摇一摇功能的实现方法,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.List; import java.util.Random; import android.app.Activity; import android.app.Service; import android.content.res.Resources; import android.hardware.Sensor; impo

  • Android利用方向传感器获得手机的相对角度实例说明

    1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端. 将手机放在桌子上,z轴的方向是从手机指向天空. 2.方向传感器 在方向传感器中values变量的3个值都表示度数,它们的含义如下: values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度.0表示北(North):90表示东(East):180表示南(Sou

随机推荐