【问题标题】:How to load large bitmap efficiently with Picasso?如何使用毕加索有效地加载大位图?
【发布时间】:2018-08-23 18:04:28
【问题描述】:

我正在开发一个墙纸应用程序,我在 GridView 中借助 firebase 和 Picasso 显示图像。我想从服务器检索图像并根据屏幕分辨率调整其大小。设图片尺寸为3000 * 5000,设备屏幕尺寸为720 * 1280,则图片裁剪为720 * 1280。

https://developer.android.com/topic/performance/graphics/load-bitmap 给出了解决方案,但它调整了可绘制文件的大小并具有固定大小。

但我想根据设备屏幕大小调整服务器图像的大小。

RecyclerView ViewHolder

public void setDetails(Context ctx, String image){

        ImageView mImageTv = mView.findViewById(R.id.rImageView);

        Picasso.get().load(image).into(mImageTv);

    }

使用 putExtra 将图像从 Fragment 传递到 FullscreenActivity

ViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);
                viewHolder.setOnclickListener(new ViewHolder.ClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {

                        ImageView mImageView = view.findViewById(R.id.rImageView);

                        Drawable mDrawable = mImageView.getDrawable();
                        Bitmap mBitmap = ((BitmapDrawable) mDrawable).getBitmap();

                        Intent intent = new Intent(view.getContext(), PostDetailsActivity2.class);
                        ByteArrayOutputStream stream = new ByteArrayOutputStream();

                        mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                        byte[] bytes = stream.toByteArray();
                        intent.putExtra("image", bytes);
                        startActivity(intent);


                    }

在全屏活动中显示图像

mImageTv = findViewById(R.id.full_imageView1);


        byte[] bytes = getIntent().getByteArrayExtra("image");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

        mImageTv.setImageBitmap(bmp);

如果可以的话,请帮助我....如果有人需要更多代码细节或我的问题,请发表评论....谢谢

【问题讨论】:

  • 我相信您想要的是将 Firebase 下载的图像作为缩略图加载并调整大小到 GridView 中?

标签: android android-imageview android-image android-bitmap


【解决方案1】:

好的,由于您使用 Picasso 库来加载图像,因此该库会在加载图像后自动为您处理实际位图的缓存。您的代码中有一个明显的问题是您正试图通过 Intent 传递位图,这通常是一个很大的禁忌,因为位图数据相当大并且会产生巨大的性能成本。相反,当您第一次调用 Picasso.get().load(image).into(mImageTv) Picasso 时,它实际上会为您保存该位图(以一种有效的方式),因此下次您调用 Picasso.get().load(image) 时,该图像将已经存储在您的应用程序中,而您实际上并没有再次拨打网络电话。因此,在您的FullscreenActivity 中,您只需再次致电Picasso.get().load(image).into(mImageTv)

现在以正确的方式显示图像,如果您的服务器图像是 3000x5000 并且您的设备屏幕尺寸是 720x1280 并且您想要显示整个图像,您可以使用 Picasso 提供的centerCrop 函数Picasso.get().load(image).fit().centerCrop().into(mImageTv)。它将调整图像的大小以适应屏幕的整个边界,并确保图像保持其纵横比(因为服务器图像的纵横比与设备屏幕的纵横比不匹配)。

【讨论】:

    【解决方案2】:

    获取屏幕宽度和高度:

    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    int height = displayMetrics.heightPixels;
    int width = displayMetrics.widthPixels;
    

    然后使用滑动调整大小:

    GlideApp  
        .with(context)
        .load(url)
        .override(600, 200) // resizes the image to these dimensions (in pixel). resize does not respect aspect ratio
        .into(imageViewResize);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多