Java 在android中借助加速度计移动球
我已经编写了一个代码,在android的加速计的帮助下移动一个球,这样,如果球碰到4条边中的任何一条,它就会重新出现在另一条边上,我的问题就解决了 1.球不会重新出现在对边上 2.更改lanscape的方向 这是我的密码Java 在android中借助加速度计移动球,java,android,accelerometer,Java,Android,Accelerometer,我已经编写了一个代码,在android的加速计的帮助下移动一个球,这样,如果球碰到4条边中的任何一条,它就会重新出现在另一条边上,我的问题就解决了 1.球不会重新出现在对边上 2.更改lanscape的方向 这是我的密码 public class Accelerate extends Activity implements SensorEventListener { float x, y, sensorX, sensorY, a, b, centerX, centerY; Bitmap ba
public class Accelerate extends Activity implements SensorEventListener {
float x, y, sensorX, sensorY, a, b, centerX, centerY;
Bitmap ball;
SensorManager sm;
NixSurface ourSurfaceView;
public class NixSurface extends SurfaceView implements Runnable {
SurfaceHolder ourHolder;
Thread ourThread = null;
boolean isRunning = false;
public NixSurface(Context context) {
super(context);
ourHolder = getHolder();
}
public void pause() {
isRunning = false;
while (true) {
try {
ourThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
ourThread = null;
}
public void resume() {
isRunning = true;
ourThread = new Thread(this);
ourThread.start();
}
public void run() {
// TODO Auto-generated method stub
while (isRunning) {
if (!ourHolder.getSurface().isValid())
continue;
Canvas canvas = ourHolder.lockCanvas();
canvas.drawRGB(255, 255, 255);
centerX = canvas.getWidth() / 2;
centerY = canvas.getHeight() / 2;
x += sensorX;
y += sensorY;
a = centerX + x;
b = centerY + y;
if (a > canvas.getWidth())
a = 0;
if (b > canvas.getHeight())
b = 0;
if (a < 0)
a = canvas.getWidth();
if (b < 0)
b = canvas.getHeight();
canvas.drawBitmap(ball, a, b, null);
ourHolder.unlockCanvasAndPost(canvas);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sm.getSensorList(Sensor.TYPE_ACCELEROMETER).size() != 0) {
Sensor s = sm.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
sm.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL);
}
x = y = sensorY = sensorX = 0;
ball = BitmapFactory.decodeResource(getResources(), R.drawable.nix);
ourSurfaceView = new NixSurface(this);
ourSurfaceView.resume();
setContentView(ourSurfaceView);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
sm.unregisterListener(this);
super.onStop();
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
// nothing to do here
}
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
try {
Thread.sleep(16);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sensorX = -event.values[0];
sensorY = event.values[1];
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
公共类加速扩展活动实现SensorEventListener{
浮动x、y、传感器x、传感器a、b、中心x、中心y;
位图球;
传感器管理器sm;
NixSurfaceView;
公共类NixSurface扩展了SurfaceView实现Runnable{
表面持有人;
线程ourThread=null;
布尔值isRunning=false;
公共曲面(上下文){
超级(上下文);
ourHolder=getHolder();
}
公共空间暂停(){
isRunning=false;
while(true){
试一试{
ourThread.join();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
打破
}
ourThread=null;
}
公众简历(){
isRunning=true;
ourThread=新线程(此线程);
ourThread.start();
}
公开募捐{
//TODO自动生成的方法存根
同时(正在运行){
如果(!ourHolder.getSurface().isValid())
继续;
Canvas Canvas=ourHolder.lockCanvas();
canvas.drawRGB(255、255、255);
centerX=canvas.getWidth()/2;
centerY=canvas.getHeight()/2;
x+=传感器x;
y+=感官;
a=中心x+x;
b=中心y+y;
如果(a>canvas.getWidth())
a=0;
如果(b>canvas.getHeight())
b=0;
if(a<0)
a=canvas.getWidth();
if(b<0)
b=canvas.getHeight();
画布.drawBitmap(球、a、b、空);
我们的持有者。解锁CanvasandPost(画布);
}
}
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
sm=(SensorManager)getSystemService(Context.SENSOR\u服务);
if(sm.getSensorList(Sensor.TYPE_Accelerator).size()!=0){
传感器s=sm.getSensorList(传感器类型\加速计).get(0);
sm.registerListener(此,s,传感器管理器。传感器延迟正常);
}
x=y=传感器x=0;
ball=BitmapFactory.decodeResource(getResources(),R.drawable.nix);
ourSurfaceView=新表面(此);
我们的surfaceview.resume();
setContentView(我们的SurfaceView);
}
@凌驾
受保护的void onStop(){
//TODO自动生成的方法存根
sm.取消注册侦听器(此);
super.onStop();
}
精度更改时的公共无效(传感器,int精度){
//TODO自动生成的方法存根
//这里没什么可做的
}
传感器更改时的公共无效(传感器事件){
//TODO自动生成的方法存根
试一试{
睡眠(16);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
sensorX=-event.values[0];
感官=事件值[1];
}
@凌驾
公共无效OnConfiguration已更改(配置newConfig){
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Picture);
}
}我想你的问题在于你假设传感器原点(x=0,y=0)是屏幕中心。传感器原点位于屏幕的左上角(X指左,Y指下),因此将a&b与
canvas.getWidth()
&canvas.getHeight()
进行比较是不正确的,因为您已经添加了centerX
¢erY
。另外,由于X从来都不是负数,因此否定sensorX
将导致条件a>canvas.getWidth()
永远不会发生。能否给我一个比较部分的示例代码,以便我改进代码