Android OpenGL ES 2:如何在主活动中将OpenGL活动用作片段

3

我对Android和OpenGL ES非常新手。 我必须在OpenGL中创建GUI,并希望将其用作主活动中的Fragment。 为了学习如何做到这一点,我尝试了两个教程 - 这个Fragment教程Android开发人员关于OpenGL ES的教程

但是我仍然不明白如何在Fragment中包含OpenGL视图。 OpenGL不使用XML布局文件,因此这个过程对我来说相当困惑。 我想做类似于这样的事情:在来自Fragment教程的主活动中,我想包含一个带有OpenGL的第三个Fragment。请对我温柔点,我是初学者 :)

1个回答

3
如果开发者教程可信的话,那么以下设置应该可以工作:
活动(Activity):
public class MainActivity extends FragmentActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener()
        {
            public void onBackStackChanged()
            {
                int backCount = getSupportFragmentManager().getBackStackEntryCount();
                if (backCount == 0)
                {
                    finish();
                }
            }
        });

        if (savedInstanceState == null)
        {
            getSupportFragmentManager().beginTransaction().add(R.id.main_container, new OpenGLFragment()).addToBackStack(null).commit();
        }
    }
}

活动XML(activity_main.xml):

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Fragment:

public class OpenGLFragment extends Fragment
{ 
    private GLSurfaceView mGLView;

    public OpenGLFragment()
    {
        super();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        mGLView = new MyGLSurfaceView(this.getActivity()); //I believe you may also use getActivity().getApplicationContext();
        return mGLView;
    }
}

我猜你需要按照教程自己创建GLSurfaceView:

class MyGLSurfaceView extends GLSurfaceView {

    public MyGLSurfaceView(Context context){
        super(context);
        setEGLContextClientVersion(2);    
        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(new MyRenderer());

    }
}

根据教程所述,制作您的渲染器:
public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}

根据我在http://stackoverflow.com/questions/24840509/why-does-the-new-adt-create-a-static-inner-class-fragment-by-default-simple-fr提出的问题,设置Activity和Fragment。 - EpicPandaForce
1
非常感谢,第二个实现方法可行(即带有 return mGLView; 的那个)。 - ChrisX
谢谢,不用谢,答案已经对齐了 :) - EpicPandaForce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接