Android利用传感器仿微信摇一摇功能
作者:小小时光机 发布时间:2022-09-10 18:18:18
传感器
简单的介绍一下传感器:
就是设备用来感知周边环境变化的硬件。
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);
}
猜你喜欢
- 继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下
- 1. 源码阅读环境搭建ide:IntelliJ IDEA 2020.1包管理:gradleeureka版本:1.10.11Spring Cl
- 案例:public interface ForumService { void removeTopic(int topicId); void
- 概述:利用AccessibilityService机制实现了一个比较好玩儿的功能,微信朋友圈自动遍历点赞。即通过不断的滚动+点赞实现把每一条
- Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以&
- 1. 配置MailPlugin插件public void configPlugin(PluginLoader pluginLoader) {
- 今天做了一个java对象转Map的例子,执行的时候报错了,如下:Exception in thread "main" j
- 使用HTTPclient访问url获得数据最近项目上有个小功能需要调用第三方的http接口取数据,用到了HTTPclient,算是做个笔记吧
- 本文实例为大家分享了unity3D实现摄像机抖动的具体代码,供大家参考,具体内容如下摄像机抖动特效 在需要的地方调用CameraShake.
- 一、选择结构大纲if单选择结构if双选择结构if多选择结构嵌套的if结构switch多选择结构二、if单选择结构我们很多时候需要去判断一个东
- 本文介绍了如何使用Spring Security OAuth2构建一个授权服务器来验证用户身份以提供access_token,并使用这个ac
- Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他
- BeanPostProcessor 的接口定义,可以实现提供自己的实例化逻辑,依赖解析逻辑等,也可以以后在Spring容器实例化完毕,配置和
- 好久没有做web了,JSON目前比较流行,闲得没事,所以动手试试将对象序列化为JSON字符(尽管DotNet Framework
- 本文实例讲述了java获取百度网盘真实下载链接的方法。分享给大家供大家参考。具体如下:目前还存在一个问题,同一ip在获取3次以后会出现验证码
- 目录一、String的用法1.构造方法2.求字符串长度和某一位置字符3.提取子串4.字符串比较5.字符串链接6.字符串中单个字符查找7.大小
- 一、叙述当Spring的事件(Application Event)为Bean和Bean之间的消息同步提供了支持。当一个Bean处理完成一个任
- 1 pom.xml文件注:热部署功能spring-boot-1.3开始有的<!--添加依赖--><dependency&g
- Java 8来了,是时候学一下新的东西了。Java 7和Java 6只不过是稍作修改的版本,而Java 8将会发生重大的改进。或许是Java
- 概述对象实例由对象头、实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度;| 类型 | 32位JVM | 6