Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈
来源:互联网 发布:linuxzip解压软件下载 编辑:程序博客网 时间:2024/05/23 02:26
- protected void render(GLCanvas canvas) {
- Log.d("Lich", "-------", new Throwable());
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中相关源码:
- <SPAN style="FONT-SIZE: 12px"> public void onDrawFrame(GL10 gl) {
- ...
- onDrawFrameLocked(gl);</SPAN>
public void onDrawFrame(GL10 gl) {... onDrawFrameLocked(gl);
- <SPAN style="FONT-SIZE: 12px"> private void onDrawFrameLocked(GL10 gl) {
- ...
- mContentView.render(mCanvas);</SPAN>
private void onDrawFrameLocked(GL10 gl) {... mContentView.render(mCanvas);
- <SPAN style="FONT-SIZE: 12px"> public void onSurfaceCreated(GL10 gl1, EGLConfig config) {
- ...
- mGL = gl;
- mCanvas = new GLCanvasImpl(gl);</SPAN>
public void onSurfaceCreated(GL10 gl1, EGLConfig config) {... mGL = gl; mCanvas = new GLCanvasImpl(gl);
然后是AlbumSetPage中:
- <SPAN style="FONT-SIZE: 12px"> 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();
- }</SPAN>
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
- Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈
- Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈
- Android4.2.2 Gallery2源码分析(4)——GLCanvas.java
- Android4.2.2 Gallery2源码分析(5)——GLCanvasImpl.java
- Android4.2.2 Gallery2源码分析(6)——GLView.java
- Android4.2.2 Gallery2源码分析(4)——GLCanvas.java
- Android4.2.2 Gallery2源码分析(5)——GLCanvasImpl.java
- Android4.2.2 Gallery2源码分析(6)——GLView.java
- Android4.2.2 Gallery2源码分析(8)——假装的Activity
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(10)——Activity于View的结合
- Android4.2.2 Gallery2源码分析(11)——Gallery的层次结构图
- Android4.2.2 Gallery2源码分析(8)——假装的Activity
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(10)——Activity于View的结合
- Android4.2.2 Gallery2源码分析(11)——Gallery的层次结构图
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(3)——分析Gallery.java
- 【故障处理】solaris10 /nfs/status服务absent
- android 创建menu,并以ActionBar的形式显示
- SQL的SUBSTR()函数
- java批量将utf-8转化为gbk
- C++ 虚基类、虚继承
- Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈
- java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码
- 怎样解决Java Web项目更改项目名后报错
- MySQL:Specified key was too long; max key length is 767 bytes
- 消息循环中的TranslateMessage函数和DispatchMessage函数
- Java底层
- SVN 冲突解决方法
- 如何自己生成PCM 文件
- java中Class.getResource用于获取类路径