package org.tomahawk.tomahawk_android.views; import android.content.Context; import android.graphics.Matrix; import android.util.AttributeSet; import android.widget.ImageView; public class BottomCropImageView extends ImageView { public BottomCropImageView(Context context) { super(context); setup(); } public BottomCropImageView(Context context, AttributeSet attrs) { super(context, attrs); setup(); } public BottomCropImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setup(); } private void setup() { setScaleType(ScaleType.MATRIX); } @Override protected boolean setFrame(int frameLeft, int frameTop, int frameRight, int frameBottom) { if (getDrawable() != null) { float frameWidth = frameRight - frameLeft; float frameHeight = frameBottom - frameTop; float originalImageWidth = (float) getDrawable().getIntrinsicWidth(); float originalImageHeight = (float) getDrawable().getIntrinsicHeight(); float usedScaleFactor = 1; if ((frameWidth > originalImageWidth) || (frameHeight > originalImageHeight)) { // If frame is bigger than image // => Crop it, keep aspect ratio and position it at the bottom and center horizontally float fitHorizontallyScaleFactor = frameWidth / originalImageWidth; float fitVerticallyScaleFactor = frameHeight / originalImageHeight; usedScaleFactor = Math.max(fitHorizontallyScaleFactor, fitVerticallyScaleFactor); } float newImageWidth = originalImageWidth * usedScaleFactor; float newImageHeight = originalImageHeight * usedScaleFactor; Matrix matrix = getImageMatrix(); matrix.setScale(usedScaleFactor, usedScaleFactor, 0, 0); // Replaces the old matrix completly matrix.postTranslate((frameWidth - newImageWidth) / 2, frameHeight - newImageHeight); setImageMatrix(matrix); } return super.setFrame(frameLeft, frameTop, frameRight, frameBottom); } }