Accelerometer Play是一个加速度计的Demo,具体位置为<sdk>/samples/android-<version>/,工程运行的效果如图:
图1 运行效果图
将源码导入到Eclipse中 ,目录结构为:
图2 目录结构
AndroidManifest.xml
所有添加的Android的四大组件,都需要在该文件中进行注册,该文件中还涉及到apk的一些权限等,由于该工程只有一个Activity,该文件比较简单。
图3 AndroidManifest.xml
AccelerometerPlayActivity
整个工程的布局文件(main.xml)非常简单,实际加载的是自定义的SimulationView,所以整个程序最核心的内容,其实就是这个自定义的view。类图如下:
图4 AccelerometerPlayActivity类图
SensorEventListener接口
该接口的用途是:当传感器的值发生变化时,接口从
SensorManager发出的通知。它定义了两个方法:
public void onSensorChanged(SensorEvent event);
public void onAccuracyChanged(Sensor sensor, int accuracy);
一个是当传感器的值发生变化时调用的方法,一个是当传感器的精度发生变化时调用的方法。
Particle类
图5 Particle类图
每一个小球就记录当前位置和上一次的位置,可以到达的位置,以及加速度。为了接近真实环境,每个小球都有自己的摩擦系数。这个摩擦系数在构造函数中模拟产生。这个类中有两个重要的方法:
public void computePhysics(float sx, float sy, float dT, float dTC)
public void resolveCollisionWithBounds()
第一方法是通过物理定理(大概是
F= ma,其中F是摩擦力f和重力G的合力,计算出小球水平和垂直的位置
)计算出小球的当前位置,可以到达的位置,上一次的位置。
第二个方法是限定小球的滚动范围,保证小球在屏幕范围内滚动。
ParticleSystem类
图6
ParticleSystem类图
小球
Particle的集合类,常量
NUM_PARTICLES 定义了小球的数量,其中有一个重要的方法:
public void update(float sx, float sy, long now) 通过迭代的方式来更新小球的位置。
SimulationView类
该类是一个自定义的控件,继承了android.view.View
,实现了
SensorEventListener接口,其中有几个重要的方法:
public void startSimulation();
该方法用来注册一个SensorManager,注册后可以获取重力加速度,同时设置
SensorEventListener,
传感器的值发生变化时调用注册的listener中的方法。
public void stopSimulation()
解除注册的
SensorManager,当推出当前Activity时,调用该方法,否则会抛出异常。
protected void onDraw(Canvas canvas)
这个方法是重写了View中的方法,自定义控件都要重写这个方法,在这个方法中,通过计算出的小球的位置,将小球,及背景及时的画在屏幕上。