Android : SensorManager 传感器入门 简单应用

功能介绍:转动手机 图片跟着旋转

界面:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/baseline_img" />
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.example.mysensormanager;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

/**
 * 1.获取SensorManager对象
 * 2.获取Sensor 对象
 * 3.注册Sensor 对象
 * 4.重写 onAccuracyChanged, onSensorChanged 方法
 * 5.注销Sensor对象
 */
public class MainActivity extends AppCompatActivity implements SensorEventListener {
    SensorManager mSensorManager;
    Sensor sensor;
    ImageView imageView;
    private float startDegree = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.imageView);

        //获取传感器服务
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        /**获取传感器对象
         * Sensor.TYPE_ACCELEROMETER:加速度传感器,用于检测手机在X、Y、Z三个方向上的加速度变化。
         * Sensor.TYPE_GRAVITY:重力传感器,用于检测手机受到的重力加速度变化。
         * Sensor.TYPE_GYROSCOPE:陀螺仪传感器,用于检测手机的角速度变化。
         * Sensor.TYPE_MAGNETIC_FIELD:磁力传感器,用于检测设备周围的磁场强度和方向。
         * Sensor.TYPE_LIGHT:光线传感器,用于检测手机周围的光线强度。
         * Sensor.TYPE_PRESSURE:气压传感器,用于检测设备周围的大气压强。
         * Sensor.TYPE_LINEAR_ACCELERATION:线性加速度传感器,用于检测手机在X、Y、Z三个方向上的线性加速度变化。
         * Sensor.TYPE_ORIENTATION:方向传感器,用于检测手机的朝向变化。
         * Sensor.TYPE_PROXIMITY:距离传感器,用于检测设备与目标物体之间的距离
         * Sensor.TYPE_ROTATION_VECTOR:旋转矢量传感器,用于检测手机的旋转变化。
         * Sensor.TYPE_TEMPERATURE:温度传感器,用于检测手机的温度变化。
         * Sensor.TYPE_FINGERPRINT:指纹传感器,用于检测设备的指纹信息。
         * Sensor.TYPE_HEART_RATE:心率传感器,用于检测用户的心率变化。
         * Sensor.TYPE_STEP_COUNTER:步数传感器,用于检测用户行走的步数。
         * */
        //方向传感器,用于检测手机的朝向变化。
        sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

    }

    @Override
    protected void onResume() {
        super.onResume();
        //打开应用:创建onCreate --> 开始onStart-->运行onResume
        //重新打开应用:重新启动onRestart--> 开始onStart-->运行onResume
        //返回当前页:重新启动onRestart--> 开始onStart-->运行onResume
        //注册Sensor
        /** 传感器延时:
         * 多久获取一次数据  最快
         SENSOR_DELAY_FASTEST = 0
         适合游戏
         SENSOR_DELAY_GAME = 1
         绘画
         SENSOR_DELAY_UI = 2
         普通界面
         SENSOR_DELAY_NORMAL =3
         */
        if (sensor != null) {
            mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
        } else {
            // 设备可能不支持ORIENTATION传感器,处理这种情况...
            Toast.makeText(this, "设备可能不支持ORIENTATION传感器", Toast.LENGTH_SHORT).show();
        }


    }

    @Override
    protected void onPause() {
        super.onPause();
        //退出应用:暂停onPause --> 停止onStop-->销毁onDestroy
        // home : 暂停onPause --> 停止onStop
        //跳转页面时:当前页:暂停onPause --> 停止onStop
        //注销Sensor对象
        if (sensor != null) {
            mSensorManager.unregisterListener(this);
        }

    }


    @Override
    public void onSensorChanged(SensorEvent event) {
        //传感器发生改变
        //校验  if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){}
        //values[0]: Acceleration minus Gx on the x-axis
        //values[1]: Acceleration minus Gy on the y-axis
        //values[2]: Acceleration minus Gz on the z-axis
        if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {

            float degree = (float) event.values[0]; // 获取当前旋转的角度(以弧度为单位)并转换为度数格式
            //设置动画
            /** RotateAnimation
             * fromDegrees:旋转的开始角度。
             * toDegrees:旋转的结束角度。
             * pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
             * pivotXValue:X坐标的伸缩值。
             * pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
             * pivotYValue:Y坐标的伸缩值。
             * */
            RotateAnimation rotateAnimation = new RotateAnimation(startDegree, degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            //设置动画时间
            rotateAnimation.setDuration(300);
            imageView.startAnimation(rotateAnimation);
            startDegree = degree; // 更新上次旋转的角度为当前旋转的角度
        }
    }


    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // 在这里可以处理传感器精度的变化,但与ORIENTATION传感器无关,因此可以忽略。


    }
}

注意事项:

1. 要注销Sensor对象

2.要在真机上测试,模拟器不支持

3.不要阻塞 onSensorChanged() 方法

4.避免使用过时的方法 或 传感器类型

5.在使用前先验证传感器 

6.谨慎选择传感器延时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/246292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity 手机号登录

一、工作流程 1.向手机发送验证码&#xff0c;第三方短信发送平台&#xff0c;如阿里云短信。 2.手机获取验证码后&#xff0c;在表单中输入验证码。 3.使用自定义过滤器​SmsCodeValidateFilter​。 4.短信校验通过后&#xff0c;使用自定义手机认证过滤器​SmsCodeAuthentic…

ROS2 Control分析讲解

ROS2 Control 文章目录 前言简述组成安装 框架Controller ManagerResource ManagerControllersUser Interfaces Hardware ComponentsURDF中的硬件描述机器人运行框架 总结 前言 ros2_control是一个使用&#xff08;ROS 2&#xff09;进行机器人&#xff08;实时&#xff09;控…

如何用开关电源测试系统测试电源峰值电流?

一、用万用表、示波器测量峰值电流 首先将待测电路输入信号线分别连接到测试电路的输入端和地端。待测电路的电源端连接电源。然后将示波器设置为AC耦合模式&#xff0c;通道1连接待测电路输入端&#xff0c;通道2连接待测电路地端。调整数字万用表为电流测量模式。打开电源&am…

使用VeryFL【02】python环境安装

新建虚拟环境 conda create --name vfl python3.7激活新建的虚拟环境 conda activate vfl安装pytorch 安装Brownie pip install eth-brownie -i https://pypi.tuna.tsinghua.edu.cn/simple

一款计算机顶会爬取解析系统 paper info

一款计算机顶会爬取解析系统 paper info 背景项目实现的功能 技术方案架构设计项目使用的技术选型 使用方法本地项目部署使用ChatGPT等大模型创建一个ChatGPT助手使用阿里云 顶会数据量 百度网盘pfd文件json文件 Q&A github链接 &#xff1a;https://github.com/codebricki…

Nginx+Tomcat实现负载均衡和动静分离

目录 前瞻 动静分离和负载均衡原理 实现方法 实验&#xff08;七层代理&#xff09; 部署Nginx负载均衡服务器(192.168.75.50:80) 部署第一台Tomcat应用服务器&#xff08;192.168.75.60:8080&#xff09; 多实例部署第二台Tomcat应用服务器&#xff08;192.168.75.70:80…

LOF基金跟股票一样吗?

LOF基金&#xff0c;全称为"上市型开放式基金"&#xff0c;是一种可以在上海证券交易所认购、申购、赎回及交易的开放式证券投资基金。投资者可以通过上海证券交易所场内证券经营机构或场外基金销售机构进行认购、申购和赎回基金份额。 LOF基金的特点是既可以像股票…

DataGrip连接Hive以及MySQL

如果连接失败&#xff0c;是因为useSSL ,改成NO或者False;

Spring Cloud + Vue前后端分离-第5章 单表管理功能前后端开发

Spring Cloud Vue前后端分离-第5章 单表管理功能前后端开发 完成单表的增删改查 控台单表增删改查的前后端开发&#xff0c;重点学习前后端数据交互&#xff0c;vue ajax库axios的使用等 通用组件开发:分页、确认框、提示框、等待框等 常用的公共组件:确认框、提示框、等待…

时序分解 | Matlab实现DBO-VMD基于蜣螂优化算法优化VMD变分模态分解时间序列信号分解

时序分解 | Matlab实现DBO-VMD基于蜣螂优化算法优化VMD变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现DBO-VMD基于蜣螂优化算法优化VMD变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.利用蜣螂优化算法优化VMD中的参数k、a&…

【PostgreSQL】从零开始:(四)使用PgAdmin4连接数据库,及工具使用

登陆pgAdmin4 连接数据库 填写连接名称 填写连接信息 错误信息如下 解决办法 1.登陆数据库服务器切换到postgres用户 [rootpostgre-sql ~]# su - postgres 上一次登录&#xff1a;三 12月 13 18:10:00 CST 2023pts/0 上 [postgrespostgre-sql ~]$ 2.查看数据库进程 [postgre…

Linux——MySQL备份与恢复

一、数据库备份概述 1、数据备份的重要性 在企业中数据的价值至关重要&#xff0c;数据保障了企业业务的正常运行。因此&#xff0e;数据的安全性及数据的可靠性是运维的重中之重&#xff0c;任何数据的丢失都可能对企业产生严重的后果。通常情况下造成数据丢失的原因有如下几种…

JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)

目录 JVM 详解&#xff08;JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路&#xff09;1、概念&#xff1a;什么是 JVM ?JVM 的作用&#xff1f; 2、JVM 的主要组成部分&#xff1f;类加载器&#xff08;Class Loader&#xff09;&#xff1a;简单…

ECharts实现数据可视化入门教程

ECharts介绍 Apache ECharts ECharts是一个使用 JavaScript 实现的开源可视化库 入门教程 第一步&#xff1a;下载echarts.js文件 下载地址&#xff1a;下载 - Apache ECharts 点击Dist 点击echarts.min.js并保存 将下载好的.js文件引入到项目的js文件中 第二步&#xff1a;…

[多线程]线程池

目录 1.前言 2. Java中的线程池以及参数介绍 2.1 核心线程数和最大线程数 2.2最大空闲存活时间 2.3任务队列和线程工厂 2.4 拒绝策略(最重要&#xff09; 2.5 线程池的类型 3.线程池的大小如何确定 4.手动写一个线程池 1.前言 我们知道.在开发过程中.为了效率,会引进很…

理解JSX:提高前端开发效率的关键(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

CGAL的最优传输曲线重构

1、介绍 此程序包实现了一种重建和简化二维点集的方法。输入是一组具有质量属性的二维点&#xff0c;可能受到噪声和离群值的干扰。输出是一组线段和孤立点&#xff0c;它们近似于输入点&#xff0c;如下图所示。质量属性与每个点的近似重要性有关。 左&#xff1a;输入点集受到…

SWPU NSS新生赛

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白&#xff0c;正在自学ing。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐️。 ⭐️此后如竟没有炬火&#xff0c;我便是唯一的光。⭐️ 最近…

网页图标素材免费下载网站

这里是几个可以免费下载网页图标素材的的网站。这些个网站里的图表和素材&#xff0c;应该是都可以免费下载的。&#xff08;至少我下载了几个素材是没有花钱的&#xff09; Flaticon iconArchive freepik 4. iconmonstr 5. Icons and Photos For Everything 如果想下载图片&a…

在项目中,使用drawio创建一个共享协作看板

在项目中&#xff0c;使用drawio创建一个共享协作看板 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…