FitWidth ImageView: 宽度自适应
public class FitWidthImageView extends ImageView { public FitWidthImageView(Context context) { super(context); setup(); } public FitWidthImageView(Context context, AttributeSet attrs) { super(context, attrs); setup(); } public FitWidthImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setup(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth(); setMeasuredDimension(width, height); } private void setup() { setScaleType(ScaleType.CENTER_CROP); } }
TopCrop ImageView : 从头部Crop而不是center
自己改名
public class FitWidthImageView extends ImageView { public FitWidthImageView(Context context) { super(context); setup(); } public FitWidthImageView(Context context, AttributeSet attrs) { super(context, attrs); setup(); } public FitWidthImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setup(); } private void setup() { setScaleType(ScaleType.CENTER_CROP); setScaleType(ScaleType.MATRIX); } @Override protected boolean setFrame(int frameLeft, int frameTop, int frameRight, int frameBottom) { 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);//BottomCrop matrix.postTranslate((frameWidth - newImageWidth) / 2, 0);//Top Crop setImageMatrix(matrix); return super.setFrame(frameLeft, frameTop, frameRight, frameBottom); } }