使用Picasso库获取图像的宽度和高度。

18
我正在使用 Picasso 库下载和加载图像到 ImageView。现在我想知道如何在将它们加载到 ImageView 之前获取图像的宽度和高度?
我有一个带有适配器的 ListView,其中包含两个 ImageView(一个是纵向的,另一个是横向的)。根据图像的宽度和高度,我想将图像加载到其中一个 ImageView 中。

请查看此链接:https://dev59.com/42ox5IYBdhLWcg3w74q3。 - Aniruddha
你可以使用 int finalHeight = iv.getMeasuredHeight(); int finalWidth = iv.getMeasuredWidth();,其中 iv 是你的 ImageView 对象。 - Aniruddha
@Aniruddha,在将图像加载到ImageView之后,它才能正常工作!但我想在加载之前知道图像的大小。 - user2549089
https://dev59.com/52Mm5IYBdhLWcg3wIsbj - Aniruddha
2个回答

36

只有在下载完位图后才能获取其尺寸 - 您必须使用同步方法调用,如下所示:

final Bitmap image = Picasso.with(this).load("http://").get();
int width = image.getWidth();
int height = image.getHeight();

接下来,您可以再次使用相同的URL调用load(它将从缓存中获取):

 Picasso.with(this).load("http://").into(imageView)

编辑:可能有更好的方法:

 Picasso.with(this).load("http://").into(new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                int width = bitmap.getWidth();
                int height = bitmap.getHeight();
                imgView.setImageBitmap(bitmap);
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {

            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {

            }
        });

4
仅供完整回答:您不能在主线程中进行此调用,因为它是同步的。因此,您需要启动一个异步任务(例如AsyncTask),该任务在后台执行此操作并在图像加载完成后返回。 - Klaus
由于Picasso异步加载图片的特性以及您的ViewHolders将被回收利用,因此这在RecyclerView中的效果会很差(当滚动浏览内容时,许多图像会弹出到不正确的位置,因为它们被加载到旧视图中)。 - Nic Robertson
请使用第二种方法。在第一种方法中,您会得到以下错误信息:"java.lang.IllegalStateException: Method call should not happen from the main thread"。 - CoolMind

2

请为我工作。

Picasso.with(context).load(imageLink).into(imageView, new Callback() {
        @Override
        public void onSuccess() {
            Picasso.with(context).load(imageLink).into(new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
                    Log.d("ComeHere ", " W : "+ width+" H : "+height);
                }

                @Override
                public void onBitmapFailed(Drawable errorDrawable) {

                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {

                }
            });

        }

        @Override
        public void onError() {

        }
    });

1
你为什么要在onSuccess方法内再次加载图像? - Aman Alam
因为他加载URL图像两次,第一次他将从URL绑定图像,第二次他创建一个虚假的目标来获取宽高图像。这将使一个同步的过程,而不是调用2个动作,它们不同步。 - Lê Tấn Thành

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