// 临时变量,保存mChildren原数组
private View[] tempViews = null;
@Override
public void draw(Canvas canvas) {
// 兼容5.0以下吸顶功能
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP
&& !getStickyChildren().isEmpty()) {
tempViews = getChildren();
if (tempViews != null) {
// 修改mChildren
setChildren(sortViews(tempViews.length));
}
}
super.draw(canvas);
// 兼容5.0以下吸顶功能
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP
&& !getStickyChildren().isEmpty() && tempViews != null) {
// 恢复mChildren
setChildren(tempViews);
}
}
// 返回排序后的children数组
private View[] sortViews(int size) {
View[] views = new View[size];
int index = 0;
int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
// 普通view
if (!isStickyChild(child)) {
views[index] = child;
index++;
}
}
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
// 吸顶view
if (isStickyChild(child)) {
views[index] = child;
index++;
}
}
return views;
}
修改好,运行测试一下,当view吸顶时,能正常显示在最上层,不会被下面的view覆盖了,好像问题已经完美解决了。可是当我点击界面上的控件时,新的问题出现了,我点击的view和响应的view不是同一个,事件的传递乱了。因为我们把view的绘制顺序改变了,所以我们实际看到的、操作的view,跟系统判断的可能不是同一个view了。显然这种解决方法引发了新的问题,是不可取的。</