使用Glide将位图加载到ImageView

8

我希望在裁剪和调整大小后,使用Glide将位图加载到ImageView中。

我不想使用ImageView.setImageBitmap(bitmap);,因为我要加载很多图片,这可能会占用一些内存,虽然这些图片很小,但我只需要使用Glide,因为我知道它优化了图像缓存。

我阅读了这篇文章,但我没有完全理解他的解决方案,当我尝试实施时。所以也许有人有一个更简洁和易于理解的解决方案。

这是我的代码,它挑选一张图片并创建出一个位图。

我需要使用Glide而不是ImageView.setImageBitmap(bitmap);

new AsyncTask<String, Void, Void>() {
    Bitmap theBitmap = null;
    Bitmap bm = null;

    @Override
    protected Void doInBackground(String... params) {
        String TAG = "Error Message: ";
        try {
            //Load the image into bitmap
            theBitmap = Glide.
                    with(mContext).
                    load("http://example.com/imageurl").
                    asBitmap().
                    into(-1, -1).
                    get();

            //resizes the image to a smaller dimension out of the main image.
            bm = Bitmap.createBitmap(theBitmap, 0, 0, 210, 80);
        } catch (final ExecutionException e) {
            Log.e(TAG, e.getMessage());
        } catch (final InterruptedException e) {
            Log.e(TAG, e.getMessage());
        } catch (final NullPointerException e) {
            //
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void dummy) {
        if (null != theBitmap) {
            //Set image to imageview.
            **// I would like to Use Glide to set the image view here Instead of .setImageBitmap function**
            holder.mImageView.setImageBitmap(bm);

            holder.mImageView.setAdjustViewBounds(true);
            holder.mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        }
    }
}.execute();

你能告诉我你的问题是什么吗?Bitmap 是 null 还是你的 ImageView 显示为白色正方形? - Yuriy Kolbasinskiy
不,位图不为空,我需要使用Glide将位图图像设置到ImageView中,而不是直接设置它。 - Tosin Onikute
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tosin Onikute
1个回答

18

使用Glide加载图片不需要AsyncTask,因为Glide会异步地加载图片。 尝试使用以下代码:

Glide.with(mContext)
                .load("http://example.com/imageurl")
                .asBitmap()
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                        // you can do something with loaded bitmap here

                        // .....

                        holder.mImageView.setImageBitmap(resource);
                    }
                });

我已经编辑了我的回答,请检查一下。附:你是否使用常量值(例如210、80)来启动位图?我认为这是不好的做法,你应该使用自定义的Drawable并进行顶部对齐。 - Yuriy Kolbasinskiy
谢谢,但这个也不起作用。当你在onResourceReady内创建位图时,它仍然和在外面创建时一样,没有任何变化! - Tosin Onikute
1
我使用常量值,因为这是预期从真实图像中裁剪出的大小,而不仅仅是任何大小。 - Tosin Onikute
1
我有时会遇到这个错误——位图太大,无法上传到纹理中 - Narendra Singh
首先,有时候这种实现方式无法加载大图像。最好将SimpleTarget用作实例变量而不是匿名类(以防止被垃圾回收)。其次,您可以让Glide在下载图像后缩放它(与您直接加载到ImageView时默认执行的操作相同)。为此,在初始化期间可以指定目标大小:SimpleTarget target = new SimpleTarget<Bitmap>(500, 300)。 - Leo DroidCoder
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接