关于Android ViewGroup 中getChildDrawingOrder()方法

 官方文档给出的 说明“

       

 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;
     }

由于是放大的那个是最后 需要绘制的,所以就不会出现这样的问题了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值