CrazyDailyQuestion icon indicating copy to clipboard operation
CrazyDailyQuestion copied to clipboard

2019-10-29: invalidate 和 requestLayout 的区别? scrollTo / scrollBy 和 computeScroll() 区别?

Open MicroKibaco opened this issue 5 years ago • 1 comments

MicroKibaco avatar Oct 28 '19 12:10 MicroKibaco

invalidate 和 requestLayout 的区别?

  • invalidate 不会调用 viewGroup 的 invalidate 方法,但是会调用 viewGroup 的 draw 而调用子view 的 onDraw
  • requestLayout 参与 view 的测量和布局,即 onMeasure 和 onLayout

scrollTo / scrollBy 和 computeScroll() 区别?

  • 观察源码 发现 scrollTo 是 scrollBy具体实现,他们共同点都是参与 view 内容的移动,作用是为具体滑动控件设置位移偏值,如双击屏幕,实现 scollview 置顶,需要注意的是,scrollTo参数为正值的时候,绘制的内容会负向移动。

    • 不同是,scrollTo是瞬时方法,不会自动使用动画,如果使用动画,需要配合.而scrollBy 是当前位移的增量偏移
  • computeScroll 在 view 重绘的时候一定会被调用

// onTouchEvent() 外: @Override
public void computeScroll() {
if (overScroller.computeScrollOffset()) { // 计算实时位置
scrollTo(overScroller.getCurrX(), overScroller.getCurrY()); // 更更新界⾯面
postInvalidateOnAnimation(); // 下⼀一帧
继续
     
  } }

MicroKibaco avatar Oct 30 '19 10:10 MicroKibaco