XML布局中的Android GLSurfaceView

Aur*_*aze 3 xml android android-layout

我试图将GLSurfaceView和一个按钮放入相同的xml布局中.但是我的应用程序在我的设备上运行时会自动关闭.有人可以帮助我,告诉我我错过了什么或我的代码有什么问题?

这是我的代码

===================

<?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id= "@+id/linearlayout1" >

    <Button
        android:id="@+id/buttonID"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:text="A Button" />

    <com.example.test2.MyGLSurfaceView
        android:id="@+id/glSurfaceViewID"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.23" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

================

package com.example.test2;

import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.MotionEvent;

public class MainActivity extends Activity {

    private GLSurfaceView mGLView;

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

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity
        mGLView = new MyGLSurfaceView(this);
        //setContentView(mGLView);
        setContentView(R.layout.activity_main);
    }

//    @Override
    protected void onPause() {
        super.onPause();
        mGLView = (MyGLSurfaceView)findViewById(R.id.glSurfaceViewID);
        mGLView.onPause();
    }
//
   @Override
   protected void onResume() {
        super.onResume();
        mGLView = (MyGLSurfaceView)findViewById(R.id.glSurfaceViewID);
        mGLView.onResume();
    }
}

class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer mRenderer;

    public MyGLSurfaceView(Context context) {
        super(context);

        // Create an OpenGL ES 2.0 context.
        setEGLContextClientVersion(2);

        // Set the Renderer for drawing on the GLSurfaceView
        mRenderer = new MyGLRenderer();
        setRenderer(mRenderer);

        // Render the view only when there is a change in the drawing data
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    }

    private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
    private float mPreviousX;
    private float mPreviousY;

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        // MotionEvent reports input details from the touch screen
        // and other input controls. In this case, you are only
        // interested in events where the touch position changed.

        float x = e.getX();
        float y = e.getY();

        switch (e.getAction()) {
            case MotionEvent.ACTION_MOVE:

                float dx = x - mPreviousX;
                float dy = y - mPreviousY;

                // reverse direction of rotation above the mid-line
                if (y > getHeight() / 2) {
                  dx = dx * -1 ;
                }

                // reverse direction of rotation to left of the mid-line
                if (x < getWidth() / 2) {
                  dy = dy * -1 ;
                }

                mRenderer.mAngle += (dx + dy) * TOUCH_SCALE_FACTOR;  // = 180.0f / 320
                requestRender();
        }

        mPreviousX = x;
        mPreviousY = y;
        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

===========================

谢谢.

Sip*_*pka 6

在MainActivity.onCreate()中使用findViewById而不是创建一个新的View.(就像你在onPause,onResume中所做的那样)并且只分配变量一次.

setContentView(R.layout.activity_main);
mGLView = (MyGLSurfaceView) findViewById(R.id.glSurfaceViewID);
Run Code Online (Sandbox Code Playgroud)

确保MyGLSurfaceView具有带AttributeSet的构造函数,因此可以从XML中扩展它.查看构造函数的stackoverflow atricle.

并且还要更改XML中的Button和MyGLSurfaceView的顺序,因为现在Button将位于布局的MyGLSurfaceView 下方,因此您将无法看到它.