`

Android学习12-----手机服务(4) 传感器

阅读更多

传感器一般用于游戏中,在 Android 系统中为了用户开发方便,提供了大量的传感器支持,要想取得这些传感器的使用,则必须依靠 getSystemService() 方法完成,通过查找指定的服务名称 Context.SENSOR_SERVICE 取得传感器服务之后,实际上返回的只是一个 android.hardware.SensorManager 类的对象,该类的常量及常用方法如下:

No.

常量与方法

描述

1

Public static final int SENSOR_DELAY_GAME

适合游戏的传感器

2

Public Boolean registerListener(SensorEventListener listener,Sensor

Sensor,int rate)

注册传感器监听器

3

Public Sensor getDefaultSensor(int type)

取得指定类型传感器对象

在上面中的 getDefaultSensor 方法需要一个传感器类型的数值,该数值是由 android.harware.Sensor 类中定义的常量来决定的,在 Android 中支持的传感器类型如下:

No.

传感器类型

描述

1

android.hardware.Sensor.TYPE_ORIENTATION

方位传感器

2

android.hardware.Sensor.TYPE_MAGNETIC_FIELD

磁场传感器

3

android.hardware.Sensor.TYPE_ACCELEROMETER

加速传感器

4

android.hardware.Sensor.TYPE_GRAVITY

重力传感器

5

android.hardware.Sensor.TYPE_GYROSCOPE

螺旋仪传感器

6

android.hardware.Sensor.TYPE_LIGHT

亮度传感器

7

android.hardware.Sensor.TYPE_LINEAR_ACCELERATION

直线加速传感器

8

android.hardware.Sensor.TYPE_PRESSURE

压力感应传感器

9

android.hardware.Sensor.TYPE_PROXIMITY

接近传感器

10

android.hardware.Sensor.TYPE_TEMPERATURE

温度传感器

11

android.hardware.Sensor.TYPE_ROTATION_VECTOR

矢量旋转传感器

12

android.hardware.Sensor.TYPE_ALL

使用全功能传感器

 

实际上对于传感器的操作主要就在操作的监听上,而如果要监听,则必须依靠 android.hardware.SensorEventListener 接口完成,定义如下:

public interface SensorEventListener{

	/**
	 * @descrption 传感器精度改变时调用
	 * @param sensor 传感器对象
	 * @param accuracy 新的传感器精度
	 */
	public abstract void onAccuracyChanged(Sensor sensor,int accuracy);

	/**
	 * @descrption 传感器数值改变时调用
	 * @param event传感器操作事件
	 */
	public abstract void onSensorChanged(SensorEvent event);
}
 

一、    方位传感器—移动小球
BallView.java

package com.iflytek.demo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.AttributeSet;
import android.view.View;

public class BallView extends View implements SensorEventListener {
	private Bitmap ball = null;
	private float[] allValue;
	private Point point = new Point();// 保存点
	private int xSpeed = 0;// x轴
	private int ySpeed = 0;// y轴

	public BallView(Context context, AttributeSet attrs) {
		super(context, attrs);
		super.setBackgroundColor(Color.WHITE); // 设置底色为白色
		this.ball = BitmapFactory.decodeResource(super.getResources(),
				R.drawable.ball);// 取得图片
		SensorManager manager = (SensorManager) context
				.getSystemService(Context.SENSOR_SERVICE); // 现在只是找到了一个传感器,但是没有定义类型
		manager.registerListener(this,
				manager.getDefaultSensor(Sensor.TYPE_ORIENTATION),// 方位传感器
				SensorManager.SENSOR_DELAY_GAME); // 创建了一个适合于游戏操作的方位传感器
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {

	}

	@Override
	public void onSensorChanged(SensorEvent event) { // 传感器方位改变
		if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { // 判断传感器方式为方位传感器
			float value[] = event.values; // 取得3个轴的值
			BallView.this.allValue = value; // 保存值并重绘
			// postInvalidate()方法主要用于非UI线程的刷新操作
			// invalidate()主要用于UI线程的刷新
			super.postInvalidate(); // 刷新界面调用onDraw()
		}
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Paint p = new Paint(); // 根据传感器的数值来改变球的速度
		if (this.allValue != null) { // 已经取得了数据
			this.xSpeed = (int) -this.allValue[2]; // 计算X轴速度
			this.ySpeed = (int) -this.allValue[1];// 设置Y轴速度
		}
		this.point.x += this.xSpeed;// X坐标点
		this.point.y += this.ySpeed;// Y坐标点
		if (this.point.x < 0) {// 设置X轴坐标
			this.point.x = 0;
		}
		if (this.point.y < 0) {
			this.point.y = 0;
		}
		if (point.x > super.getWidth() - this.ball.getWidth()) { // X轴已经显示过了
			this.point.x = super.getWidth() - this.ball.getWidth();
		}
		if (point.y > super.getHeight() - this.ball.getHeight()) {
			this.point.y = super.getHeight() - this.ball.getWidth(); // 设置Y 轴的边界
		}
		canvas.drawBitmap(this.ball, this.point.x, this.point.y, p);// 重新绘制图形
	}

}

 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 自定义View组件 -->

    <com.iflytek.demo.BallView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
 

 

二、磁场传感器—指北针
ArrowView.java

package com.iflytek.demo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.AttributeSet;
import android.view.View;

public class ArrowView extends View implements SensorEventListener {
	private Bitmap comp = null;
	private float[] allValue;

	public ArrowView(Context context, AttributeSet attrs) {
		super(context, attrs);
		super.setBackgroundColor(Color.WHITE); // 底色为白色
		this.comp = BitmapFactory.decodeResource(super.getResources(),
				R.drawable.arrow);
		SensorManager manager = (SensorManager) context
				.getSystemService(Context.SENSOR_SERVICE); // 现在只是找到了一个传感器,但是没有定义类型
		manager.registerListener(this,
				manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
				SensorManager.SENSOR_DELAY_GAME); // 创建了一个适合于游戏操作的磁场传感器
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {

	}

	@Override
	public void onSensorChanged(SensorEvent event) { // 传感器方位改变
		if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { // 现在是方位传感器
			float value[] = event.values; // 取得所有的偏离数据
			ArrowView.this.allValue = value; // 取得三个轴的值
			super.postInvalidate(); // 主线程的现实需要重绘
		}
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Paint p = new Paint(); // 根据传感器的数值来改变球的速度
		if (this.allValue != null) { // 已经取得了数据
			float x = this.allValue[0];
			float y = this.allValue[1];
			canvas.restore(); // 重置绘图对象
			// 设置以屏幕中心点作为旋转中心
			canvas.translate(super.getWidth() / 2, super.getHeight() / 2);
			// 判断y轴是否为0的旋转角度
			if (y == 0 && x > 0) {
				canvas.rotate(90); // 旋转角度为90度
			} else if (y == 0 && x < 0) {
				canvas.rotate(270); // 旋转角度为270度
			} else { // 根据x和y的值计算旋转角度,而这个角度就是依靠tan()值来计算
				if (y >= 0) {
					canvas.rotate((float) Math.tanh(x / y) * 90);
				} else {
					canvas.rotate(180 + (float) Math.tanh(x / y) * 90);
				}
			}
		}
		canvas.drawBitmap(this.comp, -this.comp.getWidth() / 2,
				-this.comp.getHeight() / 2, p);
	}

}

 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 自定义View组件 -->

    <com.iflytek.demo.ArrowView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

 

 

分享到:
评论

相关推荐

    Android开发-指南针【多种传感器实现】

    在Android开发中,指南针应用是一种常见的功能,它利用设备内置的传感器来指示地球的磁场北。...开发者可以通过修改和学习这个项目,深入了解Android传感器的使用和数据处理技巧,提升自己的Android应用开发能力。

    Android-SerialPort-Tool-master.rar

    1. **硬件调试**:在开发智能硬件或嵌入式系统时,可以通过Android手机连接设备进行调试,查看硬件的运行状态和数据交换情况。 2. **物联网应用**:在物联网场景下,Android设备可以通过串口连接各种传感器或控制器...

    android_apps-kinetic_andorid_slam_

    在Android平台上实现SLAM,意味着我们可以将这项技术应用于智能手机和平板电脑等移动设备,使其具备导航和避障的能力。本项目提供的源代码利用了Android系统的开放性,集成多种传感器(如摄像头、陀螺仪、加速度计等...

    浅析Android手机传感器机制及应用设计举例.pdf

    《浅析Android手机传感器机制及应用设计举例》这篇文章主要探讨了Android智能手机中传感器的工作机制以及如何利用这些传感器进行应用设计。Android系统为开发者提供了丰富的传感器接口,使得开发者能够充分利用手机...

    Android源码手机加速度传感器 测试

    在Android系统中,加速度传感器是一种重要的硬件组件,它能够检测设备在三维空间中的线性加速度。...通过实践和研究提供的源码,可以深入学习Android传感器框架的使用,提升Android应用开发的专业技能。

    Android获取手机传感器

    首先,要获取手机传感器,你需要导入Android的SensorManager服务。在你的Activity或Service中,可以通过以下方式获取SensorManager实例: ```java SensorManager sensorManager = (SensorManager) getSystemService...

    Android代码-android姿态传感器源代码.zip

    通过分析和学习这个源代码,开发者能够掌握如何在Android应用中有效使用姿态传感器,创建动态响应的用户界面,或者开发依赖于设备位置和运动的应用。同时,也能理解如何优化传感器数据处理,提高应用的性能和用户...

    android传感器_android_

    在Android平台上,传感器技术是移动应用开发中的一个重要组成部分,它为开发者提供了与设备硬件交互的能力,从而实现各种创新的功能。本示例源码主要涵盖了三种常见的传感器:加速度传感器、方位传感器和光线传感器...

    ANDROID传感器开发.pdf

    Google Android 操作系统中内置了很多传感器,比如 G1 自带了一个非常实用的加速感应器 (微型陀螺仪),有了它,G1 手机就支持重力感应、方向判断等功能,在部分游戏或软件中可以自动识别屏幕的横屏、竖屏方向来改变...

    使用android手机陀螺仪传感器获得手机自身旋转的角度

    在Android平台上,开发一款应用程序来获取手机陀螺仪传感器数据并计算手机相对于初始位置的旋转角度是一项技术性任务。陀螺仪传感器是移动设备中的一种关键硬件,它能够检测设备在三维空间中的角速度变化,这对于...

    Android-USB-Serial-Monitor-Lite

    在现代科技领域,Android设备的广泛应用不仅局限于智能手机和平板电脑,它还被广泛用于与各种硬件设备的交互,例如通过USB接口与下位机进行通信。"Android-USB-Serial-Monitor-Lite"就是这样一个工具,它为开发者和...

    hiflying-iots-android-smartlink-demo.zip

    4. **代码案例**:压缩包中的代码是实际可运行的示例,有助于开发者理解和学习如何在Android应用中集成物联网功能。 5. **开源**:意味着源代码可供任何人查看、使用、修改和分发,遵循特定的开源许可证。这种开放...

    Android传感器应用实例

    "Android传感器应用实例"是一个专为学习Android传感器开发而设计的项目,通过两个具体的Activity,深入浅出地展示了如何利用Android的传感器API。 第一个Activity的主要目标是展示手机中的传感器数量和类型。在...

    Android-Fall-Detection一款基于Android手机的老人跌倒检测系统

    本文将详细介绍一款名为“Android-Fall-Detection”的应用,它是一款专为老人设计的跌倒检测系统,利用Android智能手机的内置加速度传感器来实时监测并预防可能的跌倒事件。 首先,我们要理解跌倒检测系统的工作...

    Android应用源码之平台智能手机的温度传感器应用-IT计算机-毕业设计.zip

    通过学习和分析源码,开发者不仅可以掌握Android传感器的使用,还能了解到如何将硬件数据转化为有意义的用户界面信息。这对于进行Android移动开发App的毕业设计或论文撰写具有很高的参考价值。在实践中,你可以...

    android硬件传感器.txt

    ### Android硬件传感器知识点详解 #### 一、引言 随着移动技术的发展,智能手机已经成为人们日常生活中不可或缺的一部分。而其中,Android系统因其开放性和灵活性而受到广泛欢迎。Android设备上配备的各种传感器更...

    Android应用源码之(加速度传感器)-IT计算机-毕业设计.zip

    - 学习和理解Android的生命周期管理,确保在适当的时候启动和停止传感器服务。 - 掌握Android的权限管理,因为访问传感器可能需要特定的权限。 - 了解不同设备间传感器的差异,因为不同硬件供应商的传感器性能可能不...

    Android-nRF-Toolbox-master.rar_android_nRF android_nrf master_nr

    总的来说,Android-nRF-Toolbox-master项目为我们提供了一个实用的平台,通过它可以学习和实践Android与蓝牙设备的通信,特别是在低功耗蓝牙领域。对于开发者而言,这不仅是一个工具,更是一个学习和创新的起点。...

    android 加速度和陀螺仪传感器

    Android 加速度和陀螺仪传感器 Android 加速度和陀螺仪传感器是 Android 设备中两种常用的传感器,...通过学习和掌握加速度和陀螺仪传感器的原理和应用,可以更好地开发 Android 应用程序,实现更加智能和高效的应用。

Global site tag (gtag.js) - Google Analytics