通常,如果我们提供不同密度的图像(sdpi、mdpi、hdpi、xhdpi 等)会更好。如果我使用某种库(Picasso、Glide、Volley 等)从服务器检索它,我是否需要提供相同的东西,或者我应该只提供原始图像并且库会将其转换为适当的大小和密度我的应用程序?
注意:如果我提供不同大小或密度的图像,我不会检索所有图像。我只是检索所有图像 url,然后只下载一次。这种方式更好,还是提供一个原始图像 url 并检索它并将其重新调整为适当的大小更好?
通常,如果我们提供不同密度的图像(sdpi、mdpi、hdpi、xhdpi 等)会更好。如果我使用某种库(Picasso、Glide、Volley 等)从服务器检索它,我是否需要提供相同的东西,或者我应该只提供原始图像并且库会将其转换为适当的大小和密度我的应用程序?
注意:如果我提供不同大小或密度的图像,我不会检索所有图像。我只是检索所有图像 url,然后只下载一次。这种方式更好,还是提供一个原始图像 url 并检索它并将其重新调整为适当的大小更好?
这取决于目的。例如,如果您只需要显示这样的小头像:
您只需要在服务器端有小图像,这将减少内存使用、网络使用和显示图片的时间。
大图像的另一种情况。例如:
这里显示的音乐专辑和图像必须具有高分辨率。
如果您的服务器上有两种类型的图像,一种是小的,一种是大的,并且您可以根据情况接收图像会更好。
不要担心硬盘的大小,这将使 ImageLoaders 自行控制。图像大小影响内存使用和网络使用。
下载不同大小的文件绝对被认为是一种好的做法。去年,Google I/O 2014 应用程序就这个主题写了一篇文章。
Glide 提供了BaseGlideUrlLoader类,如果你的后端支持它,它允许你将你的图像请求存储为各种不同的大小。
例如,Glide 的FlickrModelLoader使用 Flickr 的 API 以及您的请求大小来仅下载所需的最小图像,从而节省电池、带宽并确保请求尽快完成。
BaseGlideUrlLoader 的简单示例实现可能如下所示:
public class ExampleUrlLoader extends BaseGlideUrlLoader<YourModel> {
private static final int ORIGINAL_SIZE = -1;
@Override
protected String getUrl(YourModel model, int width, int height) {
int maxSize = Math.max(width, height);
final int size;
if (maxSize > 800) {
size = ORIGINAL_SIZE;
} else if (maxSize > 400) {
size = 800;
} else if (maxSize > 200) {
size = 400;
} else if (maxSize > 50) {
size = 200;
} else {
size = 50;
}
return model.getBaseUrl() + "&size=" + size;
}
}
您还可以查看 Glide 的GiphyModelLoader以获取另一个示例,和/或 Glide 的关于 bucketing sizes 的 wiki 页面。
让它们有多种尺寸是个好主意。如果您只传输实际显示大小的图像,您将减少需要从服务器传输的数据量,同时处理一些 OOM 错误。如果您担心这将占用硬盘的大小,您始终可以在发送流之前缩小服务器上的一个原始图像。
没有确定的答案。这些库将毫无问题地调整您的图像大小(以及 Bojan 的帖子中提到的 OOM 错误
但
整个事情都是图像质量。如果在运行时缩放它可能会比预先缩放更糟。因此,如果您关心它的外观(恕我直言),请提供不同的 dpi 图像
我认为唯一的问题是图像下载性能。如果您下载的图像较大,则您的图像视图将调整图像大小,但您将使用比较小图像下载所需的更多数据。如果您将下载较小的图像,您将使用较少的数据,但图像质量会很低。