Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈


    protected void render(GLCanvas canvas) {
        Log.d("Lich", "-------", new Throwable());
上面是GLView.java的render方法。

以前在查看View类及其子类的源码时,有一个很疑惑的地方——绘图是只需要在onDraw(Canvas canvas)中实现即可,而画图时用到的这个Canvas对象是哪里来的,以前了解是由系统调用onDraw()时传入的,因此赋值由系统决定,至于何处赋的值并没有深究,而这里借助GLView,刚好可以分析一下,GLCanvas的赋值和传值过程。


这里我写入了一个log代码,查看GLView中该函数的调用堆栈。选出其中一处进行解析:

D/Lich    ( 4109): java.lang.Throwable
D/Lich    ( 4109):     at com.android.gallery3d.ui.GLView.render(GLView.java:224)
D/Lich    ( 4109):     at com.android.gallery3d.app.AlbumSetPage$1.render(AlbumSetPage.java:170)
D/Lich    ( 4109):     at com.android.gallery3d.ui.GLRootView.onDrawFrameLocked(GLRootView.java:450)
D/Lich    ( 4109):     at com.android.gallery3d.ui.GLRootView.onDrawFrame(GLRootView.java:381)
D/Lich    ( 4109):     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1550)
D/Lich    ( 4109):     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1263)
D/Lich    ( 4109): -------

首先查看GLRootView中相关源码:

    public void onDrawFrame(GL10 gl) {

...

            onDrawFrameLocked(gl);

    private void onDrawFrameLocked(GL10 gl) {

...

           mContentView.render(mCanvas);
    public void onSurfaceCreated(GL10 gl1, EGLConfig config) {
...
            mGL = gl;
            mCanvas = new GLCanvasImpl(gl);


然后是AlbumSetPage中:

        protected void render(GLCanvas canvas) {
            canvas.save(GLCanvas.SAVE_FLAG_MATRIX);
            GalleryUtils.setViewPointMatrix(mMatrix,
                    getWidth() / 2 + mX, getHeight() / 2 + mY, mZ);
            canvas.multiplyMatrix(mMatrix, 0);
            super.render(canvas);//此处调用上一级render(canvas)
            canvas.restore();
        }

接下来就是GLView.java中的render方法了。

这里清晰的看到了GLView中render()在某一处的调用堆栈。

需要说明的是如果AlbumSetPage中没有调用super.render(canvas)则不执行GLView.java中的render()方法,这里调用了说明GLView的render()方法中执行了一些必要的动作。


这里在GLRootView中也给出了canvas的值,这说明所有这一系列调用栈中使用的canvas都是在GLRootView中定义的canvas


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值