SeekBar OpenGLRenderer GL_INVALID_VALUE

今天把自己做的垂直SeekBar替换进项目发现一个蛋疼的问题,logcat 一直提示 OpenGLRenderer GL_INVALID_VALUE

D/OpenGLRenderer(10887): GL error from OpenGLRenderer: 0x501
E/OpenGLRenderer(10887): GL_INVALID_VALUE

百度了一下,发现这边两篇文章值得借鉴 http://hzhuzhiyu.blog.163.com/blog/static/167972388201384115125665/ 和  http://blog.csdn.net/maybe_windleave/article/details/8946368

做项目中遇到OpenGLRenderer GL_INVALID_VALUE错误引起花屏,并抛出异常的问题。后来分析了下,和android硬件加速器有关。
最后发现问题的原因是:
切图的尺寸不是8的整数倍,导致底层解码的时候报了 GL_INVALID_VALUE 的错误。把图片的尺寸修改成8的整数倍后,问题解决了。
-------------------------------------
后来又遇到这么问题,底层分配失败了。分析了下,是因为做屏幕适配,1080P的图片引起的。纠结的。。。
10-11 17:20:51.436: D/OpenGLRenderer(32701): Could not allocate texture for layer (fbo=1 800x1184)
10-11 17:20:51.436: D/AndroidRuntime(32701): Shutting down VM
把1080P的图片删除了,就可以解决。
1080P切图不能太大,160*160会引起异常,切图大小建议96*96

最后补充说明在分析上述的花屏问题时,发现将.9图片去掉换成普通资源,该问题也会得到修正。

项目里面的SeekBar有4个,是不是个数太多,于是有单独封装了一个小demo测试,发现还是GL_INVALID_VALUE。我记得前面封装垂直SeekBar测试的时候,并没有遇到这个问题,如是对比代码发现,自己范了一个相当自以为是的错误:把SeekBar 的图片都做成了.9.png格式的了。

要想 SeekBar 的progressDrawable 的background 没有圆角,background的图片需要做成.9.png,以自动伸缩适配,而progress 确并不需要做成.9.png.

而现在这个 GL_INVALID_VALUE 一方面就是因为我把 progress 的图片也弄成.9.png的了,所以在拖动thumb刷新的时候,就会出现那个问题。而 progress为普通图片,则不会。不过测试的时候还发现,出现这个问题,与.9.png也有一点关系,有一张.9.png做progress ,拖动变化的时候,不会出现那个error,有一张偶尔出现,其他两张,大量出现,并且有时还花屏走样。

同样,我把系统的SeekBar 的 progress指定为一张.9.png 的图片,同样出现OpenGLRenderer GL_INVALID_VALUE。

所以可以总结如下:

1.需要频繁读取重绘的图片资源,最好不要做成.9.png的,以免引起OpenGLRenderer 的错误。

2.若必须使用.9.png,那么也得注意其格式规格,尽量少的去引起这个问题。

当然这些只是我这个DEMO总结出来的,并为做详细的研究论证,只做思考建议。





		//background 与 progress 指定drawable的方式有区别
    
    
    
        //此处用普通 图片资源,若用.9.png可能会引发 OpenGLRenderer GL_INVALID_VALUE
        
        
    



DEMO源码下载路径:

http://download.csdn.net/detail/luohaowang320/6710313

只需将里面的SeekBar 的 progress drawable 引用换成 资源里面的.9.png 和 .png 分别运行,你就会发现我前面描述的效果。

你可能感兴趣的:(Android,UI,项目日记)