当前位置:

首页 > 系统应用 > 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
    作者最新文章
    系统应用 传感器
    相关文章 更多
    寻影 Meet Flip 会议摄像头发布:一体化翻折设计、搭索尼 1/2 英寸传感器,599 元
    寻影 Meet Flip 会议摄像头发布:一体化翻折设计、搭索尼 1/2 英寸传感器,599 元

    寻影推出MeetFlip4KAI会议摄像头:一体化翻折设计搭配金属转轴,搭载索尼1/2英寸传感器,支持4K@30fps与相位对焦。具备AI构图、挥手控制变焦、双麦克风四种收音模式及美颜功能,首发价599元。

    新型量子传感器可探测引力波和暗物质
    新型量子传感器可探测引力波和暗物质

    一种新型量子传感器通过两个不同位置的原子干涉仪共用同一束激光测量,有效抵消激光噪声,成功提取微弱信号。实验表明该装置能排除噪声干扰,捕捉模拟的早期引力波和超轻暗物质信号,为研究超大质量黑洞形成和暗物质本质开辟新途径。

    消息称索尼黑卡 RX10 V 相机 7 月 9 日发布:升级新处理器,传感器与镜头不变
    消息称索尼黑卡 RX10 V 相机 7 月 9 日发布:升级新处理器,传感器与镜头不变

    索尼黑卡RX10V相机将于七月九日发布,核心升级为新处理器与NP-FZ100电池,运算速度与自动对焦性能均大幅提升,传感器与镜头沿用前代一英寸两千万像素CMOS及24-600mmF2.4-F4镜头。此外,FX5电影摄影机也预计于7月中旬后登场。

    索尼 FX5 电影摄影机实拍图首曝:威尼斯菜单,16MP 全堆栈传感器支持 5K 片门全开、三原生 ISO
    索尼 FX5 电影摄影机实拍图首曝:威尼斯菜单,16MP 全堆栈传感器支持 5K 片门全开、三原生 ISO

    索尼FX5电影摄影机实拍图曝光,菜单采用威尼斯风格,搭载1600万像素全堆栈传感器,支持5K片门全开、三原生ISO,可机内录制X-OCNLTRAW格式,具备高动态范围和优秀低光性能,采用紧凑机身设计,画质出色,预计本月下旬发布。

    斗鱼直播手机版设置不允许斗鱼广告访问传感器的方法
    斗鱼直播手机版设置不允许斗鱼广告访问传感器的方法

    斗鱼APP,作为备受欢迎的直播平台,其首页界面内容丰富多样,特别适合喜欢通过直播进行社交互动的人群。它不仅提供了大量的游戏类直播、短视频和资讯文章,还支持用户进行自主创作和分享。然而,有部分用户反映,在使用过程中经常会受到“摇一摇”“扭一扭”等基于传感器触发的广告干扰,这对正常的使用体验造成了影响。

    曝尼康 DL 紧凑型数码相机有望复活,配 1 英寸传感器和变焦镜头
    曝尼康 DL 紧凑型数码相机有望复活,配 1 英寸传感器和变焦镜头

    尼康DL系列紧凑型数码相机有望复活,搭载2400万像素堆栈式1英寸传感器与变焦镜头,机身设计接近原DL18-50和DL24-85,或合并为24-70版本,支持灵活颜色控制,附皮革相机包,EVF可单独购买。目前仍属爆料阶段。

    中国科学家研发低噪声高灵敏磁传感器,1赫兹下可达15.7纳特斯拉
    中国科学家研发低噪声高灵敏磁传感器,1赫兹下可达15.7纳特斯拉

    IT之家 8 月 15 日消息,中国科学院合肥物质科学研究院强磁场科学中心联合中国科学院宁波材料技术与工程研究所、宁波东方理工大学,围绕通过调控自旋织构动力学来抑制磁传感器噪声这一物理机制取得进展,成功研制出一种同时具备高灵敏度和低噪声特性的反常霍尔磁传感器。相关成果已经发表于《物理评论快报》。高性

    领普人体存在传感器ES5顶装版发售,69元
    领普人体存在传感器ES5顶装版发售,69元

    领普人体存在传感器ES5顶装版售价69元,采用雷达、红外与光照三模融合设计,可探测呼吸、微动等细微动作。顶装需预留75mm孔位及零火线,支持30°角度调节,运动探测直径14米,存在探测直径10米。提供融合与雷达双模式,支持一键扫描干扰源,内置光照传感器联动灯具。

    索尼推出黑卡 RX10V 长焦相机:2010 万像素 1 英寸传感器、等效 24-600mm 镜头,国行 15199 元
    索尼推出黑卡 RX10V 长焦相机:2010 万像素 1 英寸传感器、等效 24-600mm 镜头,国行 15199 元

    索尼全新黑卡RX10V第五代旗舰级长焦相机发布,搭载2010万像素高画质1英寸堆栈式传感器与等效24-600mm超远摄镜头,国行15199元。支持每秒30张高速连拍、AI智能主体识别系统、无裁切4K60p视频录制,配备新型NP-FZ100锂电池,续航约630张照片。

    尼康新品 APS-C 高端相机曝光:青春版 Z9/ZR,搭载 45MP 堆栈式传感器
    尼康新品 APS-C 高端相机曝光:青春版 Z9/ZR,搭载 45MP 堆栈式传感器

    据爆料,尼康即将推出一款APS-C高端相机,搭载4500万像素堆栈式传感器,具备高速连拍能力,定位类似D500后续机型,或为融合RED技术的迷你Z9/ZR变体,预计8至9月发布。

    查看更多
    精品专题 更多
    装机必备
    装机必备

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

    Windows
    Windows

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

    PDF教程
    PDF教程

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

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

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

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

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

    Aperty macOS版
    Aperty macOS版
    macOS

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

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

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

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

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

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。