带有 GLSurfaceView.Renderer 的安卓传感器

标签 android opengl-es sensors

我有主要 Activity

public class MainActivity extends Activity {

  private static SensorManager sensorService;
  private GLSurfaceView view;
  private Sensor sensor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        GLSurfaceView view = new GLSurfaceView(this);
        view.setRenderer(new SceneView());
        setContentView(view);

        sensorService = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensor = sensorService.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        if (sensor != null) {
            sensorService.registerListener(mySensorEventListener, sensor,
                    SensorManager.SENSOR_DELAY_NORMAL);
            Log.i("Compass MainActivity", "Registerered for ORIENTATION Sensor");

        } else {
            Log.e("Compass MainActivity", "Registerered for ORIENTATION Sensor");
            Toast.makeText(this, "ORIENTATION Sensor not found",
                    Toast.LENGTH_LONG).show();
            finish();
        }
    }


    private SensorEventListener mySensorEventListener = new SensorEventListener() {

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            // angle between the magnetic north directio
            // 0=North, 90=East, 180=South, 270=West
            float azimuth = event.values[0];
            view.updateData(azimuth);

        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (sensor != null) {
            sensorService.unregisterListener(mySensorEventListener);
        }
    }

}

场景

public class SceneView implements GLSurfaceView.Renderer {

    private float position = 0;
    private Square mSquare;

    public SceneView() {
        mSquare = new Square();
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
        gl.glShadeModel(GL10.GL_SMOOTH);
        gl.glClearDepthf(1.0f);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glDepthFunc(GL10.GL_LEQUAL);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    }

    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glTranslatef(0, 0, -6);
        mSquare.draw(gl);
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    public void updateData(float position) {
    }

}

当我调用 updateData 时出现错误,因为 SensorEventListener mySensorEventListener 中的 view 为 null 如何解决这个问题?

http://www.vogella.com/articles/AndroidSensor/article.html作者使用 extends View 并且他的代码工作完美,当我使用 implements GLSurfaceView.Renderer 和不同的构造过程时,所有中断

最佳答案

您在 onCreate 方法中再次将 GLSurfaceView 声明为 local 变量:

GLSurfaceView view = new GLSurfaceView(this);

所以当在 onCreate 中引用它时,它不是引用 成员 GLSurfaceView(私有(private) GLSurfaceView View ),而是引用 < em>本地一个。

省略onCreateview的声明:

view = new GLSurfaceView(this);

它会起作用。

关于带有 GLSurfaceView.Renderer 的安卓传感器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670792/

相关文章:

javascript - react-native-webview 调用时崩溃应用程序

android - 使用带有phonegap的Google登录来获取用户信息

android - 在 Android 中使用 Volley 库时数据未发布到服务器

ios - 除了使用 Core Animation 感知渲染缓冲区之外,还有其他显示 OpenGL 内容的方法吗?

android - 如何减慢android传感器事件

Android Sensor Timestamp 引用时间

java - 改造返回一个空的响应主体

c++ - 在只接触深度缓冲区的 openGL 中进行绘制调用

java - W/OpenGLRenderer : Points are too far apart

java - SensorSimulator 在连接时抛出错误