官方文档给出的 说明“
protected int getChildDrawingOrder (int childCount, int i)
返回迭代的绘制子类索引。如果你想改变子类的绘制顺序就要重写该方法。默认返回 i 值。
提示:为了能够调用该方法,你必须首先调用setChildrenDrawingOrderEnabled(boolean)
来允许子类排序。
参数
childCount 子类个数
i 当前迭代顺序
返回值
绘制该迭代子类的索引
上面 是官方 给出的说明, 在调用draw()方法时,将会调用getChildDrawingOrder(int childCount ,int i)方法,ViewGroup 中默认是从上绘制到下,
如果有需要改变绘制的 先后的顺序,就可以从写改方法,(注意,我说的是顺序而不是位置 )
在onmeasure,onLayout 方法中,位置和大小早就确定了, 所以说是不可能改变的。
上面说明可能 不太明白,给出列子吧:
如果看到上面 这样的 图,就知道是什么意思了,我想放大GridView中间的那个item,但是由于 gridview 是从上往下绘制,导致 下面的 item 覆盖在上面了,所以我们就得从写 getChildDrawingOrder(int childCount ,int i)这个方法
改变绘制的顺序,
@Override
protected
int
getChildDrawingOrder(
int
childCount,
int
i) {
position = getSelectedItemPosition() - getFirstVisiblePosition();
if
(position<
0
){
return
i;
}
else
{
if
(i == childCount -
1
){
//这是最后一个需要刷新的item
if
(position>i){
position=i;
}
return
position;
}
if
(i == position){
//这是原本要在最后一个刷新的item
return
childCount -
1
;
}
}
return
i;
}
由于是放大的那个是最后 需要绘制的,所以就不会出现这样的问题了