2 altair86 altair86 于 2013.08.08 09:08 提问

子view里的onDraw不执行,求解。。。。。

一个子view外面套了两层ViewGroup,初始时这个子View的状态为gone,当进行操作时把子view的状态更改为visible,然后调用invalidate();但这样子view的ondraw根本触发不了。。。。这是什么原因啊??
ps:1、如果就套了一层viewgroup,gone->visible后,子view的ondraw还是能调用到的
2、如果初始状态为invisible,操作时改为visible,子view的ondraw也是能调用到的
附个demo地址CSDN移动问答

1个回答

Jave_
Jave_   2013.08.08 11:29
已采纳

gone是不占用空间的,invisible是占用空间的
你设置gone后所以不会执行onDraw
你可以尝试在自定义view里加一句:setWillNotDraw(false);

altair86
altair86 先谢谢啦,卡着,找不出问题,现在只能是绕过,用个折中的办法先顶着
4 年多之前 回复
woyaowenzi
woyaowenzi 哈。我正在重装系统,等有时间了,我再看看,这种问题还是挺有意思的。
4 年多之前 回复
altair86
altair86 就是整不清楚哪里出问题了,现在。你能帮忙哪出问题了吗,我有附上工程源码的
4 年多之前 回复
woyaowenzi
woyaowenzi 可能你需要从ViewGroup以及View的绘制机制上来研究这个问题,从源码中找答案。理论上,onDraw()没有被调用的话,我认为有两种情况: ①在View的draw()方法中,如果View是dirtyOpaque==true时,不会被调用:if (!dirtyOpaque) onDraw(canvas); ②在ViewGroup的dispatchDraw()函数中,压根就没有绘制其孩子,其原因可能是子View存在SKIP_DRAW这个Flag:(child.mPrivateFlags & SKIP_DRAW) == SKIP_DRAW
4 年多之前 回复
altair86
altair86 有加的,还是没效果的
4 年多之前 回复
woyaowenzi
woyaowenzi 在你的第二层ViewGroup添加setWillNotDraw(false),或者在其构造函数里面,给其设置一个颜色,如#00000000
4 年多之前 回复
altair86
altair86 我是在gone更新为visible后才去调用invalidate()的,而不是在gone状态下。setWillNotDraw(false);已加,一点效果都没有
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!