private void fitImageToView ( ) { Drawable drawable = getDrawable ( ) ; if ( drawable == null || drawable . getIntrinsicWidth ( ) == 0 || drawable . getIntrinsicHeight ( ) == 0 ) { return ; } if ( matrix == null || prevMatrix == null ) { return ; } int drawableWidth = drawable . getIntrinsicWidth ( ) ; int drawableHeight = drawable . getIntrinsicHeight ( ) ; // // Scale image for view // float scaleX = ( float ) viewWidth / drawableWidth ; float scaleY = ( float ) viewHeight / drawableHeight ; switch ( mScaleType ) { case CENTER : scaleX = scaleY = 1 ; break ; case CENTER_CROP : scaleX = scaleY = Math . max ( scaleX , scaleY ) ; break ; case CENTER_INSIDE : scaleX = scaleY = Math . min ( 1 , Math . min ( scaleX , scaleY ) ) ; case FIT_CENTER : scaleX = scaleY = Math . min ( scaleX , scaleY ) ; break ; case FIT_XY : break ; default : // // FIT_START and FIT_END not supported // throw new UnsupportedOperationException ( "TouchImageView does not support FIT_START or FIT_END" ) ; } // // Center the image // float redundantXSpace = viewWidth - ( scaleX * drawableWidth ) ; float redundantYSpace = viewHeight - ( scaleY * drawableHeight ) ; matchViewWidth = viewWidth - redundantXSpace ; matchViewHeight = viewHeight - redundantYSpace ; if ( ! isZoomed ( ) && ! imageRenderedAtLeastOnce ) { // // Stretch and center image to fit view // matrix . setScale ( scaleX , scaleY ) ; matrix . postTranslate ( redundantXSpace / 2 , redundantYSpace / 2 ) ; normalizedScale = 1 ; } else { // // These values should never be 0 or we will set viewWidth and viewHeight // to NaN in translateMatrixAfterRotate. To avoid this, call savePreviousImageValues // to set them equal to the current values. // if ( prevMatchViewWidth == 0 || prevMatchViewHeight == 0 ) { savePreviousImageValues ( ) ; } prevMatrix . getValues ( m ) ; // // Rescale Matrix after rotation // m [ Matrix . MSCALE_X ] = matchViewWidth / drawableWidth * normalizedScale ; m [ Matrix . MSCALE_Y ] = matchViewHeight / drawableHeight * normalizedScale ; // // TransX and TransY from previous matrix // float transX = m [ Matrix . MTRANS_X ] ; float transY = m [ Matrix . MTRANS_Y ] ; // // Width // float prevActualWidth = prevMatchViewWidth * normalizedScale ; float actualWidth = getImageWidth ( ) ; translateMatrixAfterRotate ( Matrix . MTRANS_X , transX , prevActualWidth , actualWidth , prevViewWidth , viewWidth , drawableWidth ) ; // // Height // float prevActualHeight = prevMatchViewHeight * normalizedScale ; float actualHeight = getImageHeight ( ) ; translateMatrixAfterRotate ( Matrix . MTRANS_Y , transY , prevActualHeight , actualHeight , prevViewHeight , viewHeight , drawableHeight ) ; // // Set the matrix to the adjusted scale and translate values. // matrix . setValues ( m ) ; } fixTrans ( ) ; setImageMatrix ( matrix ) ; }
If the normalizedScale is equal to 1 then the image is made to fit the screen . Otherwise it is made to fit the screen according to the dimensions of the previous image matrix . This allows the image to maintain its zoom after rotation .