Android 小球地心引力感应实现
Android 小球重力感应实现重力感应主要是依靠手机的加速度传感器(accelerometer)来实现? ?? ? 在Android的
Android 小球重力感应实现
重力感应主要是依靠手机的加速度传感器(accelerometer)来实现
? ?? ? 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器。因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉。还是得根据真机的实际情况来做开发,今天我们主要来讨论加速度传感器的具体实现方式。
? ?? ??传感器名称如下:
? ?? ? 加速度传感器(accelerometer)
? ?? ? 陀螺仪传感器(gyroscope)
? ?? ? 环境光照传感器(light)
? ?? ? 磁力传感器(magnetic field)
? ?? ? 方向传感器(orientation)
? ?? ? 压力传感器(pressure)
? ?? ? 距离传感器(proximity)
? ?? ? 温度传感器(temperature)
? ?? ??1.SensorMannager传感器管理对象
? ?? ? 手机中的所有传感器都须要通过SensorMannager来访问,调用getSystemService(SENSOR_SERVICE)方法就可以拿到当前手机的传感器管理对象。
java代码:
mCanvas.drawText("Y轴重力值 :" + mGY, 0, 40, mPaint);?
mCanvas.drawText("Z轴重力值 :" + mGZ, 0, 60, mPaint);?
}?
@Override?
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {?
}?
@Override?
public void surfaceCreated(SurfaceHolder holder) {?
/**开始游戏主循环线程**/?
mIsRunning = true;?
new Thread(this).start();?
/**得到当前屏幕宽高**/?
mScreenWidth = this.getWidth();?
mScreenHeight = this.getHeight();?
/**得到小球越界区域**/?
mScreenBallWidth = mScreenWidth - mbitmapBall.getWidth();?
mScreenBallHeight = mScreenHeight - mbitmapBall.getHeight();?
}?
@Override?
public void surfaceDestroyed(SurfaceHolder holder) {?
mIsRunning = false;?
}?
@Override?
public void run() {?
while (mIsRunning) {?
/** 取得更新游戏之前的时间 **/?
long startTime = System.currentTimeMillis();?
/** 在这里加上线程安全锁 **/?
synchronized (mSurfaceHolder) {?
/** 拿到当前画布 然后锁定 **/?
mCanvas = mSurfaceHolder.lockCanvas();?
Draw();?
/** 绘制结束后解锁显示在屏幕上 **/?
mSurfaceHolder.unlockCanvasAndPost(mCanvas);?
}?
/** 取得更新游戏结束的时间 **/?
long endTime = System.currentTimeMillis();?
/** 计算出游戏一次更新的毫秒数 **/?
int diffTime = (int) (endTime - startTime);?
/** 确保每次更新时间为50帧 **/?
while (diffTime <= TIME_IN_FRAME) {?
diffTime = (int) (System.currentTimeMillis() - startTime);?
/** 线程等待 **/?
Thread.yield();?
}?
}?
}?
@Override?
public void onAccuracyChanged(Sensor arg0, int arg1) {?
// TODO Auto-generated method stub?
}?
@Override?
public void onSensorChanged(SensorEvent event) {?
mGX = event.values[SensorManager.DATA_X];?
mGY= event.values[SensorManager.DATA_Y];?
mGZ = event.values[SensorManager.DATA_Z];?
//这里乘以2是为了让小球移动的更快?
mPosX -= mGX * 2;?
mPosY += mGY * 2;?
//检测小球是否超出边界?
if (mPosX < 0) {?
mPosX = 0;?
} else if (mPosX > mScreenBallWidth) {?
mPosX = mScreenBallWidth;?
}?
if (mPosY < 0) {?
mPosY = 0;?
} else if (mPosY > mScreenBallHeight) {?
mPosY = mScreenBallHeight;?
}?
}?
}?
}
<!--EndFragment-->