Glide库中的BitmapTransformation无法按预期工作

时间:2015-06-10 22:37:43

标签: android android-glide

我是Glide图书馆的新手,按照此处的转换指南进行操作:https://github.com/bumptech/glide/wiki/Transformations

我正在尝试创建自定义转换,但是当我在转换类的transform方法中放置一个转折线时,我可以看到它永远不会被调用。

以下是我的代码:

private static class CustomTransformation extends BitmapTransformation {

    private Context aContext;

    public CustomTransformation(Context context) {
        super(context);
        aContext = context;
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return bitmapChanger(toTransform, 1080, (int) aContext.getResources().getDimension(R.dimen.big_image));
    }

    @Override
    public String getId() {
        return "some_id";
    }

}

private static Bitmap bitmapChanger(Bitmap bitmap, int desiredWidth, int desiredHeight) {
    float originalWidth = bitmap.getWidth();
    float originalHeight = bitmap.getHeight();

    float scaleX = desiredWidth / originalWidth;
    float scaleY = desiredHeight / originalHeight;

    //Use the larger of the two scales to maintain aspect ratio
    float scale = Math.max(scaleX, scaleY);

    Matrix matrix = new Matrix();

    matrix.postScale(scale, scale);

    //If the scaleY is greater, we need to center the image
    if(scaleX < scaleY) {
        float tx = (scale * originalWidth - desiredWidth) / 2f;
        matrix.postTranslate(-tx, 0f);
    }

    return Bitmap.createBitmap(bitmap, 0, 0, (int) originalWidth, (int) originalHeight, matrix, true);
}

我尝试过以两种方式启动Glide:

Glide.with(this).load(url).asBitmap().transform(new CustomTransformation(this)).into(imageView);

Glide.with(this).load(url).bitmapTransform(new CustomTransformation(this)).into(imageView);

但是都不行。有任何想法吗?同样,我不是在寻找有关Matrix本身的建议,我只是不明白为什么transform(...)根本没有被调用。谢谢!

1 个答案:

答案 0 :(得分:15)

您最有可能遇到缓存问题。第一次编译和执行代码时,转换的结果被缓存,因此下次它不必应用于同一源图像。

每个转换都有一个getId()方法,用于确定转换结果是否已更改。通常情况下,转换不会改变,但要么应用,要么不应用。你可以在开发的同时在每个构建中更改它,但它可能是tedius。

要解决此问题,您可以将以下两个调用添加到Glide载入行:

SplitRows

第一个可以更改为NONE,但是您必须等待每次从互联网加载网址,而不是仅仅从手机中读取图像。第二个是有用的,如果你可以导航到和离开有问题的转换,并想要调试它,例如。每次加载后都不需要重启以清除内存缓存。

在您完成转型开发之后,不要忘记删除这些内容,因为它们对生产性能影响很大,应该经过多次考虑后才能使用,如果有的话

注意

您似乎在尝试将图片尺寸调整为特定尺寸,然后再加载// TODO remove after transformation is done .diskCacheStrategy(SOURCE) // override default RESULT cache and apply transform always .skipMemoryCache(true) // do not reuse the transformed result while running / .override(width, height) / {{1} .centerCrop()为此。