展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 系统应用 > 10.11 传感器专题(2)——方向传感器

10.11 传感器专题(2)——方向传感器

本节引言: 在上一节中我们中我们对传感器的一些基本概念进行了学习,以及学习了使用传感器的套路, 本节给大家带来的传感器是方向传感器的用法,好的,开始本节内容~ 1.三维坐标系的概念: 在Android平台中,传感器框架通常是使用一个标准的三维坐标系来表示一个值的。以本节 要讲的方向传感器为例子,确定

本文目录

    本节引言:

    在上一节中我们中我们对传感器的一些基本概念进行了学习,以及学习了使用传感器的套路, 本节给大家带来的传感器是方向传感器的用法,好的,开始本节内容~

    1.三维坐标系的概念:

    在Android平台中,传感器框架通常是使用一个标准的三维坐标系来表示一个值的。以本节 要讲的方向传感器为例子,确定一个方向也需要一个三维坐标,毕竟我们的设备不可能永远 都是水平端着的吧,安卓给我们返回的方向值就是一个长度为3的flaot数组,包含三个方向 的值!官方API文档中有这样一个图:sensors_overview

    如果你看不懂图,那么写下文字解释:

    • X轴的方向:沿着屏幕水平方向从左到右,如果手机如果不是是正方形的话,较短的边需要水平 放置,较长的边需要垂直放置。
    • Y轴的方向:从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端
    • Z轴的方向:当水平放置时,指向天空的方向

    2.方向传感器的三个值

    上一节中说了,传感器的回调方法:onSensorChanged中的参数SensorEvent event,event的 值类型是Float[]的,而且最多只有三个元素,而方向传感器则刚好有三个元素,都表示度数! 对应的含义如下:

    values[0]:表示方位角,也就是手机围绕 Z 轴旋转时形成的角度。0 对应正北(North),90 对应正东(East),180 对应正南(South),270 对应正西(West)。如果 values[0] 恰好落在这四个数值上,而且手机是水平放置的,那么手机当前正前方指向的,正好就是这四个方向中的一个。抓住这个特性,用来做一个指南针就很合适。

    values[1]:表示倾斜角,也就是手机“翘起”了多少。当手机绕着 x 轴发生倾斜时,这个值就会跟着变化,取值范围在 [-180,180] 之间。比如把手机平放在桌面上,如果桌面足够水平,那么 values1 理论上应该是 0,不过现实里桌子很少能做到绝对水平。从手机顶部开始抬起,直到手机沿着 x 轴旋转 180 度(这时屏幕朝下水平放在桌面上),在整个过程中,values[1] 的数值会在0到-180之间变化。也就是说,手机越抬越高,values1 就会一点点变小,直到等于 -180。反过来,如果是从手机底部开始抬起,直到手机沿着 x 轴旋转 180 度,那么此时 values[1] 的值就会从0到180之间变化。也正因为 value[1] 具备这个特点,再配合 value[2],就可以实现一个平地尺。

    value[2]:滚动角,沿着Y轴的滚动角度,取值范围为:[-90,90],假设将手机屏幕朝上水平放在 桌面上,这时如果桌面是平的,values2的值应为0。将手机从左侧逐渐抬起,values[2]的值将 逐渐减小,知道垂直于手机放置,此时values[2]的值为-90,从右侧则是0-90;加入在垂直位置 时继续向右或者向左滚动,values[2]的值将会继续在-90到90之间变化!

    假如你不是很懂,没事我们写个demo验证下就知道了~

    3.简单的Demo帮助我们理解这三个值的变化:

    运行效果图:

    实现代码:

    布局代码:activity_main.xml:

    
    
    
    
    

    MainActivity.ja va:

    public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private TextView tv_value1;
        private TextView tv_value2;
        private TextView tv_value3;
        private SensorManager sManager;
        private Sensor mSensorOrientation;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            sManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            mSensorOrientation = sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
            sManager.registerListener(this, mSensorOrientation, SensorManager.SENSOR_DELAY_UI);
            bindViews();
        }
    private void bindViews() {
            tv_value1 = (TextView) findViewById(R.id.tv_value1);
            tv_value2 = (TextView) findViewById(R.id.tv_value2);
            tv_value3 = (TextView) findViewById(R.id.tv_value3);
        }
    @Override
        public void onSensorChanged(SensorEvent event) {
            tv_value1.setText("方位角:" + (float) (Math.round(event.values[0] * 100)) / 100);
            tv_value2.setText("倾斜角:" + (float) (Math.round(event.values[1] * 100)) / 100);
            tv_value3.setText("滚动角:" + (float) (Math.round(event.values[2] * 100)) / 100);
        }
    @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    }

    代码非常简单~,你想真正体验下这三个值的变化,自己运行下程序转转手机就知道了~

    4.一个简易版的文字指南针示例

    下面我们来写个简单的文字版的指南针来体验体验,当文字显示正南的时候,表示手机 的正前方就是南方!

    运行效果图:

    代码实现:

    自定义View:CompassView.ja va

    /**
     * Created by Jay on 2015/11/14 0014.
     */
    public class CompassView extends View implements Runnable{
    private Paint mTextPaint;
        private int sWidth,sHeight;
        private float dec = 0.0f;
        private String msg  = "正北 0°";
    public CompassView(Context context) {
            this(context, null);
        }
    public CompassView(Context context, AttributeSet attrs) {
            super(context, attrs);
            sWidth = ScreenUtil.getScreenW(context);
            sHeight = ScreenUtil.getScreenH(context);
            init();
            new Thread(this).start();
        }
    public CompassView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    private void init() {
    mTextPaint = new Paint();
            mTextPaint.setColor(Color.GRAY);
            mTextPaint.setTextSize(64);
            mTextPaint.setStyle(Paint.Style.FILL);
        }
    @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawText(msg, sWidth / 4 , sWidth / 2, mTextPaint);
        }
    // 更新指南针角度
        public void setDegree(float degree)
        {
            // 设置灵敏度
            if(Math.abs(dec - degree) >= 2 )
            {
                dec = degree;
                int range = 22;
                String degreeStr = String.valueOf(dec);
    // 指向正北
                if(dec > 360 - range && dec < 360 + range)
                {
                    msg = "正北 " + degreeStr + "°";
                }
    // 指向正东
                if(dec > 90 - range && dec < 90 + range)
                {
                    msg = "正东 " + degreeStr + "°";
                }
    // 指向正南
                if(dec > 180 - range && dec < 180 + range)
                {
                    msg = "正南 " + degreeStr + "°";
                }
    // 指向正西
                if(dec > 270 - range && dec < 270 + range)
                {
                    msg = "正西 " + degreeStr + "°";
                }
    // 指向东北
                if(dec > 45 - range && dec < 45 + range)
                {
                    msg = "东北 " + degreeStr + "°";
                }
    // 指向东南
                if(dec > 135 - range && dec < 135 + range)
                {
                    msg = "东南 " + degreeStr + "°";
                }
    // 指向西南
                if(dec > 225 - range && dec < 225 + range)
                {
                    msg = "西南 " + degreeStr + "°";
                }
    // 指向西北
                if(dec > 315 - range && dec < 315 + range)
                {
                    msg = "西北 " + degreeStr + "°";
                }
            }
        }
    @Override
        public void run() {
            while(!Thread.currentThread().isInterrupted())
            {
                try
                {
                    Thread.sleep(100);
                }
                catch(InterruptedException e)
                {
                    Thread.currentThread().interrupt();
                }
                postInvalidate();
            }
        }
    }

    MainActivity.ja va:

    public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private CompassView cView;
        private SensorManager sManager;
        private Sensor mSensorOrientation;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            cView = new CompassView(MainActivity.this);
            sManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            mSensorOrientation = sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
            sManager.registerListener(this, mSensorOrientation, SensorManager.SENSOR_DELAY_UI);
            setContentView(cView);
        }
    @Override
        public void onSensorChanged(SensorEvent event) {
            cView.setDegree(event.values[0]);
        }
    @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    @Override
        protected void onDestroy() {
            super.onDestroy();
            sManager.unregisterListener(this);
        }
    }

    这就是一个很简单的指南针的雏形了,有兴趣的可以自己绘制个罗盘和指针,然后实现一个 好看的指南针~

    5.本节示例代码下载:

    SensorDemo2.zip

    SensorDemo3.zip

    本节小结:

    好的,本节给大家介绍了Android中最常用的方向传感器,以及他的简单用法,以及 写了一个指南针的例子,而完成指南针我们只用到一个values[0]的值,利用其他两个 值我们还可以用来测量某地是否平躺,即制作水平尺,有空的可以写个来玩玩~ 好的,就到这里,谢谢~

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用 传感器
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。