我正在开发一个Wallpaper应用程序,在该应用程序中,我将通过Firebase和Picasso在GridView中显示图像。我想从服务器检索图像并根据屏幕分辨率调整其大小。假设图像尺寸为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);
如果可以的话,请帮助我。...如果有人需要更多代码详细信息或有关我的问题,请对此发表评论。...谢谢
答案 0 :(得分:1)
好的,因为您正在使用Picasso库加载图像,所以一旦加载图像,该库就会自动为您处理实际位图的缓存。代码中的一件明显的事情是,您试图通过一种Intent传递Bitmap,这通常是一个很大的禁忌,因为Bitmap数据相当大,并且会产生巨大的性能成本。取而代之的是,第一次调用Picasso.get().load(image).into(mImageTv)
时,毕加索实际上会(以一种有效的方式)为您保存该位图,因此,下次调用Picasso.get().load(image)
时,该图像将已经存储在本地应用程序中,实际上不必再次拨打网络电话。因此,在您的FullscreenActivity
中,您要做的就是再次致电Picasso.get().load(image).into(mImageTv)
。
现在以正确的方式显示图像,如果您的服务器图像为3000x5000,设备屏幕尺寸为720x1280,并且要显示整个图像,则可以使用Picasso提供的centerCrop
功能,{{ 1}}。它将调整图像的大小以适合屏幕的整个边界,并确保图像保留其长宽比(因为服务器图像的长宽比与设备屏幕的长宽比不匹配)。
答案 1 :(得分:0)
获取屏幕宽度和高度:
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);