private void realTimeReorder(int[] empty, int[] target) {
   boolean wrap;
   int startX;
   int endX;
   int startY;
   int delay = 0;
   float delayAmount = 30;
   if (readingOrderGreaterThan(target, empty)) {
     wrap = empty[0] >= mContent.getCountX() - 1;
     startY = wrap ? empty[1] + 1 : empty[1];
     for (int y = startY; y <= target[1]; y++) {
       startX = y == empty[1] ? empty[0] + 1 : 0;
       endX = y < target[1] ? mContent.getCountX() - 1 : target[0];
       for (int x = startX; x <= endX; x++) {
         View v = mContent.getChildAt(x, y);
         if (mContent.animateChildToPosition(
             v, empty[0], empty[1], REORDER_ANIMATION_DURATION, delay, true, true)) {
           empty[0] = x;
           empty[1] = y;
           delay += delayAmount;
           delayAmount *= 0.9;
         }
       }
     }
   } else {
     wrap = empty[0] == 0;
     startY = wrap ? empty[1] - 1 : empty[1];
     for (int y = startY; y >= target[1]; y--) {
       startX = y == empty[1] ? empty[0] - 1 : mContent.getCountX() - 1;
       endX = y > target[1] ? 0 : target[0];
       for (int x = startX; x >= endX; x--) {
         View v = mContent.getChildAt(x, y);
         if (mContent.animateChildToPosition(
             v, empty[0], empty[1], REORDER_ANIMATION_DURATION, delay, true, true)) {
           empty[0] = x;
           empty[1] = y;
           delay += delayAmount;
           delayAmount *= 0.9;
         }
       }
     }
   }
 }