我尝试使用传感器来获取原始、俯仰和滚转值。
但我将值发送到Renderer类或GLSurfaceView类
当我在智能手机上运行时,一切都会崩溃。
我尝试过使用:
MainActivity类或中的Renderer.raw = value[0];
Renderer类或中的MainActivity.x = raw;
使用功能:
void setRaw(float raw){
this.raw = raw;
}
和调用MainActivity中的函数。
所有的不幸。。。
这是我的代码:
主要活动:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
glView = new MyGLSurfaceView(this);
setContentView(glView);
baccel = false;
bcompass = false;
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accel = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
compass = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
@Override
protected void onResume() {
glView.onResume();
mSensorManager.registerListener(this,
accel,
SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this,
compass,
SensorManager.SENSOR_DELAY_NORMAL);
super.onResume();
}
@Override
protected void onPause() {
glView.onPause();
mSensorManager.unregisterListener(this, accel);
mSensorManager.unregisterListener(this, compass);
super.onPause();
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
for (int i = 0; i < 3; i++) {
accelValues[i] = event.values[i];
}
baccel = true;
break;
case Sensor.TYPE_MAGNETIC_FIELD:
for (int i = 0; i < 3; i++) {
compassValues[i] = event.values[i];
}
bcompass = true;
break;
}
if (!baccel || !bcompass)
return;
if (SensorManager.getRotationMatrix(rotationMatrix, null, accelValues,
compassValues)) {
SensorManager.remapCoordinateSystem(rotationMatrix,
SensorManager.AXIS_X, SensorManager.AXIS_Z, rotationMatrix);
SensorManager.getOrientation(rotationMatrix, values);
update();
baccel = false;
bcompass = false;
}
}
void update() {
gv.setRaw(values[0]);
gv.setPitch(values[1]);
gv.setRoll(values[2]);
}
}
和在MyGlSurfaceView:中
float raw, pitch, roll;
protected void setRaw(float raw){
this.raw = raw;
}
protected void setPitch(float pitch){
this.pitch = pitch;
}
protected void setRoll(float roll){
this.roll = roll;
}
这是我的日志
有人能帮我吗?
我的初始化代码:
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity implements SensorEventListener {
private GLSurfaceView glView;
SensorManager mSensorManager;
Sensor accel;
Sensor compass;
private MyGLSurfaceView gv;
boolean baccel, bcompass = false;
float[] accelValues = new float[3];
float[] compassValues = new float[3];
float[] rotationMatrix = new float[9];
float[] values = new float[3];
MyGLSurfaceView初始化:
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class MyGLSurfaceView extends GLSurfaceView {
MyGLRenderer mRenderer;
public MyGLSurfaceView(Context context) {
super(context);
mRenderer = new MyGLRenderer(context);
this.setRenderer(mRenderer);
this.requestFocus();
this.setFocusableInTouchMode(true);
}
我想你不知道这里发生了什么。
执行private MyGLSurfaceView gv;
时,gv是一个null变量。这意味着,如果你不做类似gv = new ......
的事情,它将在应用程序周期的剩余时间保持为空。这意味着update()
将抛出NPE。
另一方面,你有glView = new MyGLSurfaceView(this);
。这表明glView是MyGLSurfaceView,对吧?因此,即使MyGLSurfaceView
扩展了GLSurfaceView
,也应该像private MyGLSurfaceView glView;
而不是private GLSurfaceView glView;
一样定义它
因此,您应该使用glView
,因为它是您真正正确定义和实例化的唯一变量。但是要执行此操作,并且要使用设置角度方法,必须将private GLSurfaceView glView
更改为private MyGLSurfaceView glView
。
结论:
将private GLSurfaceView glView
更改为private MyGLSurfaceView glView
和
删除gv
并仅使用glView