`

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传感器开发实例,学习用。两个Activity,一个用来查看手机里的传感器的个数和种类,另一个是小游戏,用加速度传感器控制小球的位置。

    Android高级编程--源代码

    扉页 -12 版权 -11 作者简介 -10 前言 -9 目录 -4 第1章 Android简介 1 1.1 一些背景信息 2 1.1.1 不远的过去 2 1.1.2 未来的前景 2 1.2 对Android的误解 3 1.3 开放的移动开发平台 3 1.4 自带的Android应用...

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

    Android应用源码开发Demo,主要用于毕业设计学习。

    老罗android开发视频教程全集百度网盘下载

    Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序—— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。 Android以Java为编程语言,使...

    android 加速度传感器,重力传感器,线性加速度传感器

    该demo实现了 三个传感器数据获取,显示在同一个activity中,并且每隔一秒刷新数据。方便对比,学习。

    传智播客Android视频教程-课程源码.rar

    3&gt; 学习使用ANDROID操作系统 4&gt; 开发与运行(卸载)第一个ANDROID应用 5&gt; 项目的目录结构 6&gt; 项目清单文件分析 7&gt; 分析第一个ANDROID应用的启动过程 8&gt; 电话拔打 9&gt; 查看手机模拟器往控制台输出的日志信息 10&gt; 如何...

    安卓摇一摇传感器相关-手机摇一摇DEMO代码实现摇一摇执行特定程序.zip

    手机摇一摇DEMO代码,实现摇一摇执行特定程序.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    安卓传感器的学习

    Android平台下传感器与应用的开发。在物联网横空出世的时代,就算是码农也需要更多地了解传感器。

    android 计算器 定位 传感器(摇一摇)

    功能比较杂,有计算器、定位(只显示经纬度) 传感器(摇一摇得出结果) 显示手机的运营商 本来想做一些有用的功能,结果没时间做,所以就做了这些简单学习用的,(eclipse + android SDK 开发) 高手请绕道

    安卓摇一摇传感器相关-Android获取手机的基本信息.rar

    Android获取手机的基本信息.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android 4高级编程(第3版)

    《Android 4高级编程(第3版)》由Android权威专家编写,涵盖了所有最新的内容,是学习使用Android 4 SDK开发移动应用程序的理想指南。本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,...

    Android 传感器与数据库开发

    开发一个 Andorid APP,使其可以用手机传感器读取手机的实时加速度、角速度和方向角,并将数据保存,测试完成后可以导出。APP 全部代码已经提交至 Github 目录实验环境传感器开发在 onCreate 方法中,获取传感器...

    Android 4高级编程(第3版)源代码

     《Android 4高级编程(第3版)》由Android权威专家编写,涵盖了所有最新的内容,是学习使用Android 4SDK开发移动应用程序的理想指南。本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android4的新特性的潜力...

    Android开发中的重力传感器用法实例详解

    本文实例讲述了Android开发中的重力传感器用法。分享给大家供大家参考,具体如下: 重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,首先来看一副图 假设...

    Android利用温度传感器实现带动画效果的电子温度计

    Android 动画电子温度计 温度传感器 动态得展示了从手机温度传感器得到的温度值,现在提供给初学者学习研究,希望大家喜欢。

    Android 4高级编程(第3版).pdf 高清

    Android 4高级编程(第3版)》由Android权威专家编写,涵盖了所有最新的内容,是学习使用Android 4 SDK开发移动应用程序的理想指南。《Android 4高级编程(第3版)》见解深刻,帮助经验丰富的Android开发人员充分挖掘...

    代码项目-通过陀螺仪传感器算法,从声波振动中提取语音.zip

    在不获取手机麦克风权限的情况下,通过陀螺仪传感器数据的神经网络算法,就可以从声波振动中提取出讲话者的语音。 现代智能手机上的MEMS陀螺仪足够灵敏,可以测量手机附近的声音信号。结果信号仅包含非常低的频率...

    基于Android的运动管理系统

    例如QQ运动、微信运动,支付宝运动等常用运动计步软件都是直接调用Android中的Sensor传感器服务,从而获取到每日的步数。但是并非所有 4.4 版本之后的手机都有这个传感器。该传感器 采用计步传感器时,每次需要增量...

    Android高薪之路:Android程序员面试宝典 李宁

    1 1 4 如何解决Android学习中遇到的难题 1 1 5 Android只能在手机或其他移动设备上使用吗 1 2 Android的基本概念 1 2 1 Android的特点都有哪些 1 2 2 MVC模式 1 2 3 Android 的系统构架 1 3 开发Android应用程序 1 3...

    Android应用源码之平台智能手机的温度传感器应用.zip项目安卓应用源码下载

    Android应用源码之平台智能手机的温度传感器应用.zip项目安卓应用源码下载Android应用源码之平台智能手机的温度传感器应用.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司...

Global site tag (gtag.js) - Google Analytics