Android重力传感器实现滚动的弹球

时间:2022-09-20 13:32:30

熟知:

什么是传感器

     所谓传感器能够探测如光、热、温度、重力、方向 等等的功能!

android中提供传感器有哪些:

     1.  加速度传感器(重力传感器)
     2.  陀螺仪传感器
     3.  光传感器
     5.  恒定磁场传感器
     6.  方向传感器
     7.  恒定的压力传感器
     8.  接近传感器
     9.  温度传感器

一、 问题描述

android中有多达11种传感器,不同的手机设备支持的传感器类型也不尽相同

1、 重力传感器 gv-sensor
2、 加速度传感器 g-sensor
3、  磁力传感器  m-sensor
4、 方向传感器  o-sensor
5、 线性加速度传感器 la-sensor
6、 光线感应传感器 sensor_type_light
7、 温度传感器
8、 压力传感器
9、 接近传感器
10、 旋转矢量传感器 rv-sensor
11、 陀螺仪传感器gyro-sensor

  对于传感器的使用并不复杂,掌握不同传感器的作用和数据参数即可,下面我们就通过实践逐步掌握一些主要传感器的使用

  首先我们使用重力传感器来完成实现滚动的弹球,如图所示

Android重力传感器实现滚动的弹球

二、 案例技术准备

1、 传感器框架 

 传感器应用开发涉及到的组件如下:

sensor 

一个指定传感器的实例。这个类提供了各种方法让你确定传感器的功能。

sensormanager 

使用这个类来创建一个传感器服务的实例。这个类提供了各种方法类访问和列举传感器,注册和注销传感器事件监听,并获取相应的信息。设置数据获取速率,和校准传感器 

sensoreventlistener 

传感器监听器,检测传感器的数据变化,并接受传感器事件

sensorevent 

传感器事件,信息载体,检测的传感器的数据  

2、了解重力传感器 gv-sensor

  测量应用于设备x、y、z轴上的重力,重力数值为9.8

  坐标数据:

  将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。将手机朝下放在桌面上,z轴为-9.81。

  将手机向左倾斜,x轴为正值。将手机向右倾斜,x轴为负值。将手机向上倾斜,y轴为负值。将手机向下倾斜,y轴为正值。

三、 代码实现

1、基于surfaceview编写游戏界面 (mysurfaceview)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
public class mysurfaceview extends surfaceview implements callback, runnable {
 private surfaceholder sfh;
 private paint paint;
 private thread th;
 private boolean flag;
 private canvas canvas;
 private int screenw, screenh;
 //声明一个传感器管理器
 private sensormanager sm;
 //声明一个传感器
 private sensor sensor;
 //声明一个传感器监听器
 private sensoreventlistener mysensorlistener;
 //圆形的x,y坐标
 private int arc_x, arc_y;
 //传感器的xyz值
 private float x = 0, y = 0, z = 0;
 /**
 * surfaceview初始化函数
 */
 public mysurfaceview(context context) {
 super(context);
 sfh = this.getholder();
 sfh.addcallback(this);
 paint = new paint();
 paint.setcolor(color.white);
 paint.setantialias(true);
 setfocusable(true);
 //获取传感器管理类实例
 sm = (sensormanager) mainactivity.instance.getsystemservice(service.sensor_service);
 //实例一个重力传感器实例
 sensor = sm.getdefaultsensor(sensor.type_accelerometer);
 //实例传感器监听器
 mysensorlistener = new sensoreventlistener() {
  @override
  //传感器获取值发生改变时在响应此函数
  public void onsensorchanged(sensorevent event) {
  x = event.values[0];
  //x>0 说明当前手机左翻 x<0右翻
  y = event.values[1];
  //y>0 说明当前手机下翻 y<0上翻
  z = event.values[2];
  //z>0 手机屏幕朝上 z<0 手机屏幕朝下
  arc_x -= x;
  arc_y += y;
  }
  @override
  //传感器的精度发生改变时响应此函数
  public void onaccuracychanged(sensor sensor, int accuracy) {
  }
 };
 //为传感器注册监听器
 sm.registerlistener(mysensorlistener, sensor, sensormanager.sensor_delay_game);
 }
 /**
 * surfaceview视图创建,响应此函数
 */
 @override
 public void surfacecreated(surfaceholder holder) {
 screenw = this.getwidth();
 screenh = this.getheight();
 flag = true;
 //实例线程
 th = new thread(this);
 //启动线程
 th.start();
 }
 /**
 * 游戏绘图
 */
 public void mydraw() {
 try {
  canvas = sfh.lockcanvas();
  if (canvas != null) {
  canvas.drawcolor(color.black);
  paint.setcolor(color.red);
  canvas.drawarc(new rectf(arc_x, arc_y, arc_x + 50, arc_y + 50), 0, 360, true, paint);
  paint.setcolor(color.yellow);
  canvas.drawtext("当前重力传感器的值:", arc_x - 50, arc_y - 30, paint);
  canvas.drawtext("x=" + x + ",y=" + y + ",z=" + z, arc_x - 50, arc_y, paint);
  string temp_str = "tony提示: ";
  string temp_str2 = "";
  string temp_str3 = "";
  if (x < 1 && x > -1 && y < 1 && y > -1) {
   temp_str += "当前手机处于水平放置的状态";
   if (z > 0) {
   temp_str2 += "并且屏幕朝上";
   } else {
   temp_str2 += "并且屏幕朝下,提示别躺着玩手机,对眼睛不好哟~";
   }
  } else {
   if (x > 1) {
   temp_str2 += "当前手机处于向左翻的状态";
   } else if (x < -1) {
   temp_str2 += "当前手机处于向右翻的状态";
   }
   if (y > 1) {
   temp_str2 += "当前手机处于向下翻的状态";
   } else if (y < -1) {
   temp_str2 += "当前手机处于向上翻的状态";
   }
   if (z > 0) {
   temp_str3 += "并且屏幕朝上";
   } else {
   temp_str3 += "并且屏幕朝下,提示别躺着玩手机,对眼睛不好哟~";
   }
  }
  paint.settextsize(10);
  canvas.drawtext(temp_str, 0, 50, paint);
  canvas.drawtext(temp_str2, 0, 80, paint);
  canvas.drawtext(temp_str3, 0, 110, paint);
  }
 } catch (exception e) {
  // todo: handle exception
 } finally {
  if (canvas != null)
  sfh.unlockcanvasandpost(canvas);
 }
 }
 /**
 * 触屏事件监听
 */
 @override
 public boolean ontouchevent(motionevent event) {
 return true;
 }
 /**
 * 按键事件监听
 */
 @override
 public boolean onkeydown(int keycode, keyevent event) {
 return super.onkeydown(keycode, event);
 }
 /**
 * 游戏逻辑
 */
 private void logic() {
 }
 @override
 public void run() {
 while (flag) {
  long start = system.currenttimemillis();
  mydraw();
  logic();
  long end = system.currenttimemillis();
  try {
  if (end - start < 50) {
   thread.sleep(50 - (end - start));
  }
  } catch (interruptedexception e) {
  e.printstacktrace();
  }
 }
 }
 /**
 * surfaceview视图状态发生改变,响应此函数
 */
 @override
 public void surfacechanged(surfaceholder holder, int format, int width, int height) {
 }
 /**
 * surfaceview视图消亡时,响应此函数
 */
 @override
 public void surfacedestroyed(surfaceholder holder) {
 flag = false;
 }
}

2、 编写主程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class mainactivity extends activity {
 public static mainactivity instance;
 @override
 public void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 instance = this;
 //设置全屏
 this.getwindow().setflags(windowmanager.layoutparams.flag_fullscreen, windowmanager.layoutparams.flag_fullscreen);
 requestwindowfeature(window.feature_no_title);
 //显示自定义的surfaceview视图
 setcontentview(new mysurfaceview(this));
 }
}