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

发布时间 - 2026-01-11 00:56:29    点击率:

传感器

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

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

 }

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


# Android  # 微信  # 摇一摇  # Android实现微信摇一摇功能  # android重力感应开发之微信摇一摇功能  # Android编程使用加速度传感器实现摇一摇功能及优化的方法详解  # Android实现iPhone晃动撤销输入功能 Android仿微信摇一摇功能  # Android实现摇一摇功能  # Android利用传感器实现微信摇一摇功能  # Android 微信摇一摇功能实现详细介绍  # android 类似微信的摇一摇功能实现思路及代码  # Android实现摇一摇简单功能  # 好了  # 振动器  # 用在  # 音乐播放  # 的是  # 是一个  # 在这里  # 包含了  # 多个  # 两种  # 它是  # 言归正传  # 三是  # 还可  # 两张  # 往上  # 介绍一下  # 机上  # 生产厂商  # 先来 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在建站宝盒中设置产品搜索功能?  Swift中swift中的switch 语句  如何在IIS中新建站点并配置端口与物理路径?  如何生成腾讯云建站专用兑换码?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel定时任务怎么设置_Laravel Crontab调度器配置  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Laravel怎么调用外部API_Laravel Http Client客户端使用  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  网页设计与网站制作内容,怎样注册网站?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  网站制作企业,网站的banner和导航栏是指什么?  Laravel Docker环境搭建教程_Laravel Sail使用指南  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel如何优化应用性能?(缓存和优化命令)  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  用v-html解决Vue.js渲染中html标签不被解析的问题  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  香港服务器网站卡顿?如何解决网络延迟与负载问题?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  如何在云主机快速搭建网站站点?  如何用景安虚拟主机手机版绑定域名建站?  Bootstrap整体框架之CSS12栅格系统  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  在线教育网站制作平台,山西立德教育官网?  再谈Python中的字符串与字符编码(推荐)  如何在万网利用已有域名快速建站?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  零服务器AI建站解决方案:快速部署与云端平台低成本实践  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何在阿里云ECS服务器部署织梦CMS网站?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何实现建站之星域名转发设置?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Laravel如何实现本地化和多语言支持?(i18n教程)  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  C语言设计一个闪闪的圣诞树  Laravel如何处理CORS跨域请求?(配置示例)  Python3.6正式版新特性预览