⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glsurfaceview.java

📁 android 例子中的确良ApiDemos。很有代表意义
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.graphics;import android.content.Context;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceView;import java.util.ArrayList;import java.util.concurrent.Semaphore;import javax.microedition.khronos.egl.EGL10;import javax.microedition.khronos.egl.EGL11;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.egl.EGLContext;import javax.microedition.khronos.egl.EGLDisplay;import javax.microedition.khronos.egl.EGLSurface;import javax.microedition.khronos.opengles.GL;import javax.microedition.khronos.opengles.GL10;/** * An implementation of SurfaceView that uses the dedicated surface for * displaying an OpenGL animation.  This allows the animation to run in a * separate thread, without requiring that it be driven by the update mechanism * of the view hierarchy. * * The application-specific rendering code is delegated to a GLView.Renderer * instance. */public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {    public GLSurfaceView(Context context) {        super(context);        init();    }    public GLSurfaceView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    private void init() {        // Install a SurfaceHolder.Callback so we get notified when the        // underlying surface is created and destroyed        mHolder = getHolder();        mHolder.addCallback(this);        mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);    }    public SurfaceHolder getSurfaceHolder() {        return mHolder;    }    public void setGLWrapper(GLWrapper glWrapper) {        mGLWrapper = glWrapper;    }    public void setRenderer(Renderer renderer) {        mGLThread = new GLThread(renderer);        mGLThread.start();    }    public void surfaceCreated(SurfaceHolder holder) {        mGLThread.surfaceCreated();    }    public void surfaceDestroyed(SurfaceHolder holder) {        // Surface will be destroyed when we return        mGLThread.surfaceDestroyed();    }    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {        // Surface size or format has changed. This should not happen in this        // example.        mGLThread.onWindowResize(w, h);    }    /**     * Inform the view that the activity is paused.     */    public void onPause() {        mGLThread.onPause();    }    /**     * Inform the view that the activity is resumed.     */    public void onResume() {        mGLThread.onResume();    }    /**     * Inform the view that the window focus has changed.     */    @Override public void onWindowFocusChanged(boolean hasFocus) {        super.onWindowFocusChanged(hasFocus);        mGLThread.onWindowFocusChanged(hasFocus);    }    /**     * Queue an "event" to be run on the GL rendering thread.     * @param r the runnable to be run on the GL rendering thread.     */    public void queueEvent(Runnable r) {        mGLThread.queueEvent(r);    }    @Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        mGLThread.requestExitAndWait();    }    // ----------------------------------------------------------------------    public interface GLWrapper {      GL wrap(GL gl);    }    // ----------------------------------------------------------------------    /**     * A generic renderer interface.     */    public interface Renderer {        /**         * @return the EGL configuration specification desired by the renderer.         */        int[] getConfigSpec();        /**         * Surface created.         * Called when the surface is created. Called when the application         * starts, and whenever the GPU is reinitialized. This will         * typically happen when the device awakes after going to sleep.         * Set your textures here.         */        void surfaceCreated(GL10 gl);        /**         * Surface changed size.         * Called after the surface is created and whenever         * the OpenGL ES surface size changes. Set your viewport here.         * @param gl         * @param width         * @param height         */        void sizeChanged(GL10 gl, int width, int height);        /**         * Draw the current frame.         * @param gl         */        void drawFrame(GL10 gl);    }    /**     * An EGL helper class.     */    private class EglHelper {        public EglHelper() {        }        /**         * Initialize EGL for a given configuration spec.         * @param configSpec         */        public void start(int[] configSpec){            /*             * Get an EGL instance             */            mEgl = (EGL10) EGLContext.getEGL();            /*             * Get to the default display.             */            mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);            /*             * We can now initialize EGL for that display             */            int[] version = new int[2];            mEgl.eglInitialize(mEglDisplay, version);            EGLConfig[] configs = new EGLConfig[1];            int[] num_config = new int[1];            mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1,                    num_config);            mEglConfig = configs[0];            /*            * Create an OpenGL ES context. This must be done only once, an            * OpenGL context is a somewhat heavy object.            */            mEglContext = mEgl.eglCreateContext(mEglDisplay, mEglConfig,                    EGL10.EGL_NO_CONTEXT, null);            mEglSurface = null;        }        /*         * Create and return an OpenGL surface         */        public GL createSurface(SurfaceHolder holder) {            /*             *  The window size has changed, so we need to create a new             *  surface.             */            if (mEglSurface != null) {                /*                 * Unbind and destroy the old EGL surface, if                 * there is one.                 */                mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,                        EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);                mEgl.eglDestroySurface(mEglDisplay, mEglSurface);            }            /*             * Create an EGL surface we can render into.             */            mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay,                    mEglConfig, holder, null);            /*             * Before we can issue GL commands, we need to make sure             * the context is current and bound to a surface.             */            mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,                    mEglContext);            GL gl = mEglContext.getGL();            if (mGLWrapper != null) {                gl = mGLWrapper.wrap(gl);            }            return gl;        }        /**         * Display the current render surface.         * @return false if the context has been lost.         */        public boolean swap() {            mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -