今天在写业务的时候,遇到这样一个需求,
其实这个需求很常见,就是1,2,3这三块是连在一块移动的,当2到达屏幕顶部的时候,让他悬浮在最顶部,刚开始的思路就是写两个相同的2的布局,当2到达顶部的时候,当另外一块显示出来,这样就达到了看起来悬浮在顶部的效果,但这样的缺点就是2的有好多个点击事件,这些点击事件都要重复设置两次,比较麻烦,
而我想到的一种方法是
1:当没有到达顶部的时候,我把2这块地方布局空出来,把另外的跟2一样大的布局放在2的位置上,这样的结果就是2原来是空白的,在空白的上面在layout了一个相同布局的layout,
2:每次滚动的时候重新去计算2的位置,然后重新layout
因为知道在oncreate方法中获取尺寸是获取不到的,所以我特意在OnGlobalLayoutListener代码中获取了尺寸,然后把他设置上去,最后removeOnGlobalLayoutListener();以为这样就没事了,但是刚进入这个页面的时候,始终不能把跟2相同的布局layout到2这个空白的位置上去,然而我确实是获取到了我想要的尺寸,当移动的时候,跟2相同布局却又能layout到2上去,然后我就纠结了,
然后是一阵思考。。。。。。
最后我得到的结论是
1:虽然在OnGlobalLayoutListener这个监听方法中能获取到想要的尺寸,但是把想要的布局再layout到2的过程的时候,其实第一次调用layout,整个屏幕的布局并没有全部layout好,
2:而我又调用了removeOnGlobalLayoutListener这个方法,移除了这个监听,
3:如果不移除监听,OnGlobalLayoutListener里面的方法一直会被调用,会影响UI线程,但是能够把相同的布局layout到2 这个位置上
4:最后的解决方案是在第一次滑动布局的时候去移除监听。