問題の説明:
私の友人と私はアンドロイド開発を独学しています。ゲームの物理演算や手動で更新された値などの他のクラスをデバッグし、ビー玉をボード上で斜めに描画しました。加速度計のデータを読み込むように戻すと、ビー玉は動きを止めました。したがって、問題が発生していると思われるクラスを含めます。基本的に、Android 開発におけるビュー クラスです。
私たちはアンドロイド開発を独学していますが、mSensorX および mSensorY と呼ばれる加速度計からのデータが更新されていない理由を理解できません。以下に含めるのはビュークラスです。Android 3.1向けに開発していることに注意してください。ただし、Eclipse では Android の最新機能をすべて使用しています。
package com.example.marblez;
import com.example.marblez.R;
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.WindowManager;
public class MarblezView extends View implements SensorEventListener{
//Sensor Stuff
private SensorManager mSensorManager;
private Display mDisplay;
//Accelerometer sensor stuff
private Sensor mAccelerometer;
private float mSensorX;
private float mSensorY;
//Variables related to time
private long mCpuTimeStamp;
private long mSensorTimeStamp;
private WindowManager mWindowManager;
//Accelerometer buffer, such that slight movement will roll the marble
private float sensor_buffer = 0;
//Create the canvas
private Canvas mCanvas;
private MarblezBackground background;
//Create the marble
private Marblez ball;
//Constructor for Marblez View
@SuppressWarnings("deprecation")
public MarblezView(Context context, Activity activity){
super(context);
//Setup sensor stuff
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mDisplay = mWindowManager.getDefaultDisplay();
//Set up Maze
background = new MarblezBackground(activity);
//Create our rolling little friend :-)
ball = new Marblez(activity);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
return;
/*
* record the accelerometer data, the event's timestamp as well as
* the current time. The latter is needed so we can calculate the
* "present" time during rendering. In this application, we need to
* take into account how the screen is rotated with respect to the
* sensors (which always return data in a coordinate space aligned
* to with the screen in its native orientation).
*/
switch (mDisplay.getRotation()) {
case Surface.ROTATION_0:
mSensorX = event.values[0];
mSensorY = event.values[1];
break;
case Surface.ROTATION_90:
mSensorX = -event.values[1];
mSensorY = event.values[0];
break;
case Surface.ROTATION_180:
mSensorX = -event.values[0];
mSensorY = -event.values[1];
break;
case Surface.ROTATION_270:
mSensorX = event.values[1];
mSensorY = -event.values[0];
break;
}
mSensorTimeStamp = event.timestamp;
mCpuTimeStamp = System.nanoTime();
}
//Automatic call
@Override
public void onDraw(Canvas canvas){
mCanvas = canvas;
//Draw the maze
background.drawMaze(canvas);
//Get the x and y sensor data and other goodies
final long now = mSensorTimeStamp + (System.nanoTime() - mCpuTimeStamp);
//Draw the marble
ball.drawMarble(canvas, mSensorX, mSensorY, now);
//Invalidate so it draws again
invalidate();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
私たちは、accelerometer play と呼ばれるオープンソースの Google プロジェクトから多くのアイデアと方法を得ました。ただし、そのコードに精通している人は、命名規則、メソッド、および呼び出しを単純化するために私たちが苦労したことがわかるでしょう。
基本的に、ご協力をお願いいたします。センサーは「そこにある」ように見えますが、実際には使用されません。たとえば、ビューにデバッグ マーカーを追加したときに、ビューがメソッド onSensorChangedを呼び出さないことは非常にわかりやすいです。したがって、加速度計が実際に機能していないという別のケースです。