protected void updateBaseMatrix(Drawable d){
  ImageView imageView=getImageView();
  if (null == imageView || null == d) {
    return;
  }
  final float viewWidth=getImageViewWidth(imageView);
  final float viewHeight=getImageViewHeight(imageView);
  final int drawableWidth=d.getIntrinsicWidth();
  final int drawableHeight=d.getIntrinsicHeight();
  mBaseMatrix.reset();
  final float widthScale=viewWidth / drawableWidth;
  final float heightScale=viewHeight / drawableHeight;
  if (mScaleType == ScaleType.CENTER) {
    mBaseMatrix.postTranslate((viewWidth - drawableWidth) / 2F,(viewHeight - drawableHeight) / 2F);
  }
 else   if (mScaleType == ScaleType.CENTER_CROP) {
    float scale=Math.max(widthScale,heightScale);
    mBaseMatrix.postScale(scale,scale);
    mBaseMatrix.postTranslate((viewWidth - drawableWidth * scale) / 2F,(viewHeight - drawableHeight * scale) / 2F);
  }
 else   if (mScaleType == ScaleType.CENTER_INSIDE) {
    float scale=Math.min(1.0f,Math.min(widthScale,heightScale));
    mBaseMatrix.postScale(scale,scale);
    mBaseMatrix.postTranslate((viewWidth - drawableWidth * scale) / 2F,(viewHeight - drawableHeight * scale) / 2F);
  }
 else {
    RectF mTempSrc=new RectF(0,0,drawableWidth,drawableHeight);
    RectF mTempDst=new RectF(0,0,viewWidth,viewHeight);
    if ((int)mBaseRotation % 180 != 0) {
      mTempSrc=new RectF(0,0,drawableHeight,drawableWidth);
    }
switch (mScaleType) {
case FIT_CENTER:
      mBaseMatrix.setRectToRect(mTempSrc,mTempDst,ScaleToFit.CENTER);
    break;
case FIT_START:
  mBaseMatrix.setRectToRect(mTempSrc,mTempDst,ScaleToFit.START);
break;
case FIT_END:
mBaseMatrix.setRectToRect(mTempSrc,mTempDst,ScaleToFit.END);
break;
case FIT_XY:
mBaseMatrix.setRectToRect(mTempSrc,mTempDst,ScaleToFit.FILL);
break;
default :
break;
}
}
resetMatrix();
}

protected void updateBaseMatrix ( Drawable d ) { ImageView imageView = getImageView ( ) ; if ( null == imageView || null == d ) { return ; } final float viewWidth = getImageViewWidth ( imageView ) ; final float viewHeight = getImageViewHeight ( imageView ) ; final int drawableWidth = d . getIntrinsicWidth ( ) ; final int drawableHeight = d . getIntrinsicHeight ( ) ; mBaseMatrix . reset ( ) ; final float widthScale = viewWidth / drawableWidth ; final float heightScale = viewHeight / drawableHeight ; if ( mScaleType == ScaleType . CENTER ) { mBaseMatrix . postTranslate ( ( viewWidth - drawableWidth ) / 2F , ( viewHeight - drawableHeight ) / 2F ) ; } else if ( mScaleType == ScaleType . CENTER_CROP ) { float scale = Math . max ( widthScale , heightScale ) ; mBaseMatrix . postScale ( scale , scale ) ; mBaseMatrix . postTranslate ( ( viewWidth - drawableWidth * scale ) / 2F , ( viewHeight - drawableHeight * scale ) / 2F ) ; } else if ( mScaleType == ScaleType . CENTER_INSIDE ) { float scale = Math . min ( 1.0f , Math . min ( widthScale , heightScale ) ) ; mBaseMatrix . postScale ( scale , scale ) ; mBaseMatrix . postTranslate ( ( viewWidth - drawableWidth * scale ) / 2F , ( viewHeight - drawableHeight * scale ) / 2F ) ; } else { RectF mTempSrc = new RectF ( 0 , 0 , drawableWidth , drawableHeight ) ; RectF mTempDst = new RectF ( 0 , 0 , viewWidth , viewHeight ) ; if ( ( int ) mBaseRotation % 180 != 0 ) { mTempSrc = new RectF ( 0 , 0 , drawableHeight , drawableWidth ) ; } switch ( mScaleType ) { case FIT_CENTER : mBaseMatrix . setRectToRect ( mTempSrc , mTempDst , ScaleToFit . CENTER ) ; break ; case FIT_START : mBaseMatrix . setRectToRect ( mTempSrc , mTempDst , ScaleToFit . START ) ; break ; case FIT_END : mBaseMatrix . setRectToRect ( mTempSrc , mTempDst , ScaleToFit . END ) ; break ; case FIT_XY : mBaseMatrix . setRectToRect ( mTempSrc , mTempDst , ScaleToFit . FILL ) ; break ; default : break ; } } resetMatrix ( ) ; }
calculate matrix for fit_center
