Glide学习笔记之图片变换功能Transform()

首先通过手动验证,发现imageView的默认scaleType是FIT_CENTER

查看into():

public Target<TranscodeType> into(ImageView view) {
        Util.assertMainThread();
        if (view == null) {
            throw new IllegalArgumentException("You must pass in a non null View");
        }

        if (!isTransformationSet && view.getScaleType() != null) {
            switch (view.getScaleType()) {
                case CENTER_CROP:
                    applyCenterCrop();
                    break;
                case FIT_CENTER:
                case FIT_START:
                case FIT_END:
                    applyFitCenter();
                    break;
                //$CASES-OMITTED$
                default:
                    // Do nothing.
            }
        }

        return into(glide.buildImageViewTarget(view, transcodeClass));
    }

当设置ImageView的ScaleType为CENTER_CROP、FIT_CENTER、FIT_START、FIT_END就会去调用applyCenterCrop()或者applyFitCenter()给图片添加变化,让图片充满整个屏幕。

Glide.with(this)
		.load(url)
		.dontTransform()//这个方法就是取消图片变化效果
		.into(view);

图片变化的基本用:在transform中传入想要执行的图片变化的操作

图片变换之CenterCrop源码:

CenterCrop是继承自BitmapTransformation的,整个图片变换功能都是建立在这个继承结构基础上的。

public class CenterCrop extends BitmapTransformation {

			public CenterCrop(Context context) {
				super(context);
			}

			public CenterCrop(BitmapPool bitmapPool) {
				super(bitmapPool);
			}

			// Bitmap doesn't implement equals, so == and .equals are equivalent here.
			@SuppressWarnings("PMD.CompareObjectsWithEquals")
			@Override
			/*
			*	pool:Bitmap的缓存池,对Bitmap对象进行重用
			*	totransform:原始图片的对象,也就是我们要操作的对象
			*	outWidth、outHeight:代表变换后的宽度和高度也就是override中传入的值
			**/
			protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
				final Bitmap toReuse = pool.get(outWidth, outHeight, toTransform.getConfig() != null
						? toTransform.getConfig() : Bitmap.Config.ARGB_8888);
						//逻辑的处理
				Bitmap transformed = TransformationUtils.centerCrop(toReuse, toTransform, outWidth, outHeight);
				if (toReuse != null && toReuse != transformed && !pool.put(toReuse)) {
					toReuse.recycle();
				}
				return transformed;
			}

			@Override
			public String getId() {
				return "CenterCrop.com.bumptech.glide.load.resource.bitmap";
			}
		}

public static Bitmap centerCrop(Bitmap recycled, Bitmap toCrop, int width, int height) {
		
		// 先做了一些校验,如果原图为空,或者原图的尺寸和目标裁剪尺寸相同,那么就放弃裁剪
			if (toCrop == null) {
				return null;
			} else if (toCrop.getWidth() == width && toCrop.getHeight() == height) {
				return toCrop;
			}
			// From ImageView/Bitmap.createScaledBitmap.
			// 通过数学计算来算出画布的缩放的比例以及偏移值
			final float scale;
			float dx = 0, dy = 0;
			Matrix m = new Matrix();
			if (toCrop.getWidth() * height > width * toCrop.getHeight()) {
				scale = (float) height / (float) toCrop.getHeight();
				dx = (width - toCrop.getWidth() * scale) * 0.5f;
			} else {
				scale = (float) width / (float) toCrop.getWidth();
				dy = (height - toCrop.getHeight() * scale) * 0.5f;
			}

			m.setScale(scale, scale);
			m.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
			// 判断缓存池中取出的Bitmap对象是否为空,如果不为空就可以直接使用,如果为空则要创建一个新的Bitmap对象
			final Bitmap result;
			if (recycled != null) {
				result = recycled;
			} else {
				result = Bitmap.createBitmap(width, height, getSafeConfig(toCrop));
			}

			// We don't add or remove alpha, so keep the alpha setting of the Bitmap we were given.
			// 裁剪Bitmap对象进行绘制,并将最终的结果进行返回
			TransformationUtils.setAlpha(toCrop, result);

			Canvas canvas = new Canvas(result);
			Paint paint = new Paint(PAINT_FLAGS);
			canvas.drawBitmap(toCrop, m, paint);
			return result;
		}

猜你喜欢

转载自blog.csdn.net/qq_36447701/article/details/80526275
今日推荐