前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >速读原著-Android应用开发入门教程(基本的绘制)

速读原著-Android应用开发入门教程(基本的绘制)

作者头像
cwl_java
发布2020-02-13 15:09:17
5970
发布2020-02-13 15:09:17
举报
文章被收录于专栏:cwl_Java

10.2 基本的绘制

参考示例程序:Touch Rotate(Graphics=>OpenGL ES=>Touch Rotate) 源代码:android/apis/graphics/TouchRotateActivity.java Touch Rotate 程序的运行结果如图所示:

在这里插入图片描述
在这里插入图片描述

本程序显示了一个可以旋转的立方体,TouchRotate Activity 类的结构如下所示:

代码语言:javascript
复制
    public class TouchRotateActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mGLSurfaceView = new TouchSurfaceView(this); // 建立 GLSurfaceView 
            setContentView(mGLSurfaceView); // 设置 View 到活动中
            mGLSurfaceView.requestFocus(); // 配置 GLSurfaceView 
            mGLSurfaceView.setFocusableInTouchMode(true);
        }
        //......Resume()和 onPause()方法调用 GLSurfaceView 的对应方法
        private GLSurfaceView mGLSurfaceView; // 配置 GLSurfaceView 
    }

TouchSurfaceView 是一个扩展 GLSurfaceView 类的实现,其中的 CubeRenderer 是扩展了 GLSurfaceView::Renderer 接口的实现,其主要内容如下所示:

代码语言:javascript
复制
    class TouchSurfaceView extends GLSurfaceView {
        public TouchSurfaceView(Context context) {
            super(context);
            mRenderer = new CubeRenderer(); // 建立渲染器
            setRenderer(mRenderer); // 设置渲染器
            setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
        }
        private class CubeRenderer implements GLSurfaceView.Renderer {
            // 实现渲染器接口
            public void onDrawFrame(GL10 gl) {
                // 调用 OpenGL 的标准接口进行操作
                gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
                gl.glMatrixMode(GL10.GL_MODELVIEW);
                gl.glLoadIdentity();
                gl.glTranslatef(0, 0, -3.0f);
                gl.glRotatef(mAngleX, 0, 1, 0); // 对绘制的图形进行旋转
                gl.glRotatef(mAngleY, 1, 0, 0);
                gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
                gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
                mCube.draw(gl); // 调用 draw()进行绘制
            }
        }
    }

CubeRenderer渲染器中的onSurfaceChanged()和onSurfaceCreated()两个函数进行了 Surface变化及创建时的操作。

代码语言:javascript
复制
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        float ratio = (float) width / height;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    }
    public void onSurfaceCreated(GL10 gl, EGLConfig config){
         gl.glDisable(GL10.GL_DITHER);
         gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
            GL10.GL_FASTEST);
         gl.glClearColor(1,1,1,1);
         gl.glEnable(GL10.GL_CULL_FACE);
         gl.glShadeModel(GL10.GL_SMOOTH);
         gl.glEnable(GL10.GL_DEPTH_TEST);
    }

移动的效果:

代码语言:javascript
复制
    @Override 
    public boolean onTrackballEvent(MotionEvent e) {
        mRenderer.mAngleX += e.getX() * TRACKBALL_SCALE_FACTOR;
        mRenderer.mAngleY += e.getY() * TRACKBALL_SCALE_FACTOR;
        requestRender();
        return true;
    }
    @Override 
    public boolean onTouchEvent(MotionEvent e) {
        float x = e.getX();
        float y = e.getY();
        switch (e.getAction()) {
            case MotionEvent.ACTION_MOVE:
                float dx = x - mPreviousX;
                float dy = y - mPreviousY;
                mRenderer.mAngleX += dx * TOUCH_SCALE_FACTOR;
                mRenderer.mAngleY += dy * TOUCH_SCALE_FACTOR;
                requestRender();
        }
        mPreviousX = x;
        mPreviousY = y;
        return true;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/01/14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 10.2 基本的绘制
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档