Android的setVisibility(View.GONE)無效的問題及原因分析


出現這種情況很可能是因為設置了animation,並且調用了setFillAfter(true),這就會導致setVisibility無效,只需要調用一下clearAnimation()方法或者去掉setFillAfter(true)語句即可。

實驗證明只要在setVisibility之前設置View的mCurrentAnimation為null就可以,因此調用setAnimation(null)也是可以的。從源碼來看setFillAfter為false時也會間接導致調用clearAnimation,而clearAnimation在這里使setVisibility有效的原因也是置mCurrentAnimation為null了。

setFillAfter為false時間接導致clearAnimation:

 

而mCurrentAnimation使GONE無效的初步分析很可能是下面的代碼造成:

在dispatchDraw子View的時候,盡管不為VISIBLE,由於是||的關系,也會導致drawChild被調用。而drawChild的代碼如下:

    /**
     * Draw one child of this View Group. This method is responsible for getting
     * the canvas in the right state. This includes clipping, translating so
     * that the child's scrolled origin is at 0, 0, and applying any animation
     * transformations.
     *
     * @param canvas The canvas on which to draw the child
     * @param child Who to draw
     * @param drawingTime The time at which draw is occurring
     * @return True if an invalidate() was issued
     */
    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
        return child.draw(canvas, this, drawingTime);
    }

 

 

 

 

參考:http://bbs.csdn.net/topics/390311261

http://blog.csdn.net/xxxzhi/article/details/8846248

http://stackoverflow.com/questions/8690029/why-doesnt-setvisibility-work-after-a-view-is-animated

http://www.cnblogs.com/liulipeng/p/3962101.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM