Android中FoldingLayout折叠布局的用法及实战全攻略

2019-12-10 18:55:43于丽

上述代码大家应该不陌生,只是把从View对单个图片进行绘制的修改为了ViewGroup。
既然是ViewGroup少不了onMeasure,onLayout等。测量和布局完全依赖于它的子View。
然后将需要初始化的一些东西,不依赖于宽度的,比如画笔什么的都放在构造中;依赖宽高的,都在onLayout之后,调用了updateFold();进行初始化相关代码。
updateFold中的代码,我们也不陌生,因为和上篇博客基本一致。主要就是计算mFlodWidth,mTranslateDisPerFlod以及根据设置的mNumOfFolds去循环初始化我们的matrix.
matrix完成setPolyToPoly以后,我们就可以去绘制了:

private Canvas mCanvas = new Canvas(); 
  private Bitmap mBitmap; 
  private boolean isReady; 
 
  @Override 
  protected void dispatchDraw(Canvas canvas) 
  { 
 
    if (mFactor == 0) 
      return; 
    if (mFactor == 1) 
    { 
      super.dispatchDraw(canvas); 
      return; 
    } 
    for (int i = 0; i < mNumOfFolds; i++) 
    { 
      canvas.save(); 
 
      canvas.concat(mMatrices[i]); 
      canvas.clipRect(mFlodWidth * i, 0, mFlodWidth * i + mFlodWidth, 
          getHeight()); 
      if (isReady) 
      { 
        canvas.drawBitmap(mBitmap, 0, 0, null); 
      } else 
      { 
        // super.dispatchDraw(canvas); 
        super.dispatchDraw(mCanvas); 
        canvas.drawBitmap(mBitmap, 0, 0, null); 
        isReady = true; 
      } 
      canvas.translate(mFlodWidth * i, 0); 
      if (i % 2 == 0) 
      { 
        canvas.drawRect(0, 0, mFlodWidth, getHeight(), mSolidPaint); 
      } else 
      { 
        canvas.drawRect(0, 0, mFlodWidth, getHeight(), mShadowPaint); 
      } 
      canvas.restore(); 
    } 
  } 

mFactor主要代表折叠后的总宽度与原宽度的比值,默认不折叠时为1,所以直接调用super.dispatchDraw(canvas);
那么如果为0,说明全部折起来了,我们直接if (mFactor == 0)return;就不要绘制了。
如果(0,1)之间就是正常情况了,如果还记得上一篇博客内容,无非就是根据mNumOfFolds循环绘制多次,每次绘制的时候设置matrix,利用clipRect就可以实现我们的折叠。
这里大家注意看,我在第一次绘制的时候,调用了:

super.dispatchDraw(mCanvas); 
canvas.drawBitmap(mBitmap, 0, 0, null); 
isReady = true;