全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android利用Sensor(传感器)实现指南针小功能

首先来说一说该指南针的实现思路:

程序先准备一张指南针图片,该图片上方向指针指向北方。接下来开发一个检测方向的传感器,程序检测到手机顶部绕Z轴转过多少度,让指南针图片反向转多少度即可。由此可见指南针应用只要在界面中添加一张图片,并让图片总是反向转过反向传感器返回的第一个角度值即可。

下面介绍一下方向传感器:方向传感器用于感应手机设备的摆放状态。方向传感器可以返回三个角度,这三个角度即可确定手机的摆放状态。关于方向传感器返回的三个角度的说明如下。

第一个角度:表示手机顶部朝向正北方的夹角。当手机绕着Z轴旋转时,该角度值发送改变。例如当该角度为0时,表明手机顶部朝向正北;该角度为90时,代表手机顶部朝向正东;该角度为180时,代表手机顶部朝向正南;该角度为270时,代表手机顶部朝向正西。

第二个角度:表示手机顶部或尾部翘起的角度。当手机绕着X轴倾斜时,该角度值发送改变。该角度的取值范围是-180~180。假设将手机屏幕朝上水平放在桌子上,如果桌子是完全水平的,该角度值应该是0。加入从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上),在这个旋转过程中,该角度值会从0变化为-180。也就是说,从手机顶部抬起时,该角度值会逐渐减小,直到等于-180;如果从手机底部开始抬起,知道将手机沿X轴旋转180度(屏幕向下水平放在桌面上),该角度值会从0变化为180。也就是说,从手机顶部抬起时,该角度值会逐渐增大,直到等于180。

第三个角度:表示手机左侧或右侧翘起的角度。当手机绕着Y轴倾斜时,该角度值发送改变。该角度的取值范围是-90~90。假设将手机屏幕朝上水平放在桌子上,如果桌子是完全水平的,该角度值应该是0。假设将手机左侧逐渐抬起,知道将手机沿Y轴旋转90度(手机与桌面垂直),在这个旋转过程中,该角度值会从0变化为-90。也就是说,从手机左侧抬起时,该角度值会逐渐减小,直到等于-90;如果将手机右侧逐渐抬起,知道将手机沿Y轴旋转90度(手机与桌面垂直),在这个旋转过程中,该角度值会从0变化为90。也就是说,从手机右侧抬起时,该角度值会逐渐增大,直到等于90。

step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中

compass.png

step2:设计应用的UI界面,main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:gravity="center" 
 > 
<ImageView 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:src="@drawable/compass" 
 android:id="@+id/imageView" 
 /> 
</LinearLayout> 

step3:MainActivity.java

package cn.roco.sensor; 
 
import android.app.Activity; 
import android.content.Context; 
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; 
 
public class MainActivity extends Activity { 
 
 private ImageView imageView; 
 
 /** 传感器管理器 */ 
 private SensorManager manager; 
 
 private SensorListener listener = new SensorListener(); 
 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
 
 imageView = (ImageView) this.findViewById(R.id.imageView); 
 imageView.setKeepScreenOn(true);//屏幕高亮 
 //获取系统服务(SENSOR_SERVICE)返回一个SensorManager 对象 
 manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
 } 
 
 @Override 
 protected void onResume() { 
 /** 
  * 获取方向传感器 
  * 通过SensorManager对象获取相应的Sensor类型的对象 
  */ 
 Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION); 
 //应用在前台时候注册监听器 
 manager.registerListener(listener, sensor, 
  SensorManager.SENSOR_DELAY_GAME); 
 super.onResume(); 
 } 
 
 @Override 
 protected void onPause() { 
 //应用不在前台时候销毁掉监听器 
 manager.unregisterListener(listener); 
 super.onPause(); 
 } 
 
 private final class SensorListener implements SensorEventListener { 
 
 private float predegree = 0; 
 
 @Override 
 public void onSensorChanged(SensorEvent event) { 
  /** 
  * values[0]: x-axis 方向加速度 
     values[1]: y-axis 方向加速度 
     values[2]: z-axis 方向加速度 
  */ 
  float degree = event.values[0];// 存放了方向值 
  /**动画效果*/ 
  RotateAnimation animation = new RotateAnimation(predegree, degree, 
   Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); 
  animation.setDuration(200); 
  imageView.startAnimation(animation); 
  predegree=-degree; 
  
  /** 
  float x=event.values[SensorManager.DATA_X]; 
  float y=event.values[SensorManager.DATA_Y]; 
  float z=event.values[SensorManager.DATA_Z]; 
  Log.i("XYZ", "x="+(int)x+",y="+(int)y+",z="+(int)z); 
  */ 
 } 
 
 @Override 
 public void onAccuracyChanged(Sensor sensor, int accuracy) { 
 
 } 
 
 } 
} 

step4:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 package="cn.roco.sensor" 
 android:versionCode="1" 
 android:versionName="1.0"> 
 <uses-sdk android:minSdkVersion="8" /> 
 
 <application android:icon="@drawable/icon" android:label="@string/app_name"> 
 <activity android:name="MainActivity" 
 android:label="@string/app_name"> 
 <intent-filter> 
 <action android:name="android.intent.action.MAIN" /> 
 <category android:name="android.intent.category.LAUNCHER" /> 
 </intent-filter> 
 </activity> 
 
 </application> 
</manifest> 

step5:部署应用到真机环境中  就可以查看运行的效果啦!

我的Android进阶之旅------>Android利用Sensor(传感器)实现水平仪功能的小例

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


# Android  # Sensor  # 传感器  # 指南针  # Android利用Sensor实现传感器功能  # Android传感器SensorEventListener之加速度传感器  # Android编程使用光线传感器获取光线强弱的方法【LightSensorManager封装类】  # Android开发sensor旋转屏问题解决示例  # 放在  # 在这个  # 也就是说  # 第一个  # 过程中  # 翘起  # 朝上  # 应该是  # 进阶  # 桌子上  # 之旅  # 第二个  # 并将  # 桌面上  # 管理器  # 一说  # 第三个  # 介绍一下  # 这三个  # 大家多多 


相关文章: 建站主机CVM配置优化、SEO策略与性能提升指南  网站制作话术技巧,网站推广做的好怎么话术?  ,在苏州找工作,上哪个网站比较好?  广平建站公司哪家专业可靠?如何选择?  郑州企业网站制作公司,郑州招聘网站有哪些?  如何选择高效便捷的WAP商城建站系统?  如何快速搭建响应式可视化网站?  如何在万网自助建站中设置域名及备案?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  网站制作公司排行榜,抖音怎样做个人官方网站  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  如何通过万网虚拟主机快速搭建网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  宝塔面板创建网站无法访问?如何快速排查修复?  建站之星备案流程有哪些注意事项?  做企业网站制作流程,企业网站制作基本流程有哪些?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  广德云建站网站建设方案与建站流程优化指南  建站之星后台密码遗忘如何找回?  微信小程序 input输入框控件详解及实例(多种示例)  如何快速搭建高效服务器建站系统?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  TestNG的testng.xml配置文件怎么写  制作销售网站教学视频,销售网站有哪些?  如何用好域名打造高点击率的自主建站?  想学网站制作怎么学,建立一个网站要花费多少?  建站之星价格显示格式升级,你的预算足够吗?  兔展官网 在线制作,怎样制作微信请帖?  建站之星如何配置系统实现高效建站?  css网站制作参考文献有哪些,易聊怎么注册?  音响网站制作视频教程,隆霸音响官方网站?  小型网站制作HTML,*游戏网站怎么搭建?  建站之星代理商如何保障技术支持与售后服务?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  如何在建站宝盒中设置产品搜索功能?  网站设计制作企业有哪些,抖音官网主页怎么设置?  宝塔新建站点报错如何解决?  定制建站策划方案_专业建站与网站建设方案一站式指南  实例解析angularjs的filter过滤器  C#怎么创建控制台应用 C# Console App项目创建方法  IOS倒计时设置UIButton标题title的抖动问题  已有域名建站全流程解析:网站搭建步骤与建站工具选择  太平洋网站制作公司,网络用语太平洋是什么意思?  招商网站制作流程,网站招商广告语?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  代购小票制作网站有哪些,购物小票的简要说明?  建站之星如何防范黑客攻击与数据泄露?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。