当前位置:   article > 正文

invalidate()和requestLayout()方法调用过程_requestlayout()没有调用 layout()

requestlayout()没有调用 layout()

在上一篇博客中我们开始就提到了两组方法,其中scrollTo()和scrollBy()在上一篇博客中已经说的比较详细了,但是对于另一组invalidate()系列的方法只是说明他们重新调用draw方法绘制界面,并没有说明他们究竟是怎样一步一步实现对界面进行重绘的。在这篇博客中就为大家分析一下invalidate()系列方法重绘界面的过程,同时也说明另一个在自定义控件中会用到而且和的方法invalidate()相似的方法requestLayout()方法。

首先看到invalidate()方法,不管我们是自定义继承至View还是继承至ViewGroup的控件,invalidate()方法都是调用的View类中的,查看invalidate()方法源码:

  1. public void invalidate() {
  2. invalidate(true);
  3. }
接着查看:
  1. // 参数表示是否跳过无效的步骤
  2. // 如果一个控件的大小和内容都未发生改变,可以设置为false的表示跳过无效步骤
  3. // 使用了默认修饰符,只有同一个包下的才可以调用,在不同包中即使是子类也不可以调用,所以开发者不能调用
  4. void invalidate(boolean invalidateCache) {
  5. invalidateInternal(0, 0, mRight - mLeft, mBottom - mTop, invalidateCache, true);
  6. }
接着查看invalidateInternal()方法的代码:
  1. void invalidateInternal(int l, int t, int r, int b, boolean invalidateCache,
  2. boolean fullInvalidate) {
  3. if (mGhostView != null) {
  4. mGhostView.invalidate(true);
  5. return;
  6. }
  7. // 判断是否需要跳过重新绘制,
  8. // 当需要重绘的控件是不可见的并且没有运行一个动画,就不需要重新绘制
  9. if (skipInvalidate()) {
  10. return;
  11. }
  12. if ((mPrivateFlags & (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)) == (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)
  13. || (invalidateCache && (mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == PFLAG_DRAWING_CACHE_VALID)
  14. || (mPrivateFlags & PFLAG_INVALIDATED) != PFLAG_INVALIDATED
  15. || (fullInvalidate && isOpaque() != mLastIsOpaque)) {
  16. // 是否全部重绘
  17. if (fullInvalidate) {
  18. mLastIsOpaque = isOpaque();
  19. mPrivateFlags &= ~PFLAG_DRAWN;
  20. }
  21. mPrivateFlags |= PFLAG_DIRTY;
  22. // 是否跳过无效的步骤
  23. if (invalidateCache) {
  24. mPrivateFlags |= PFLAG_INVALIDATED;
  25. mPrivateFlags &= ~PFLAG_DRAWING_CACHE_VALID;
  26. }
  27. // Propagate th
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/743003
推荐阅读
相关标签
  

闽ICP备14008679号