使用Glide显示多个图像

时间:2018-04-16 12:14:50

标签: android android-glide

我想使用滑音将一个图像显示到两个不同的图像视图中。我知道我可以简单地使用下面的代码来完成它。

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.beans.BeansException;

@UIScope
@Component
public class GridLayout extends CustomComponent implements ApplicationContextAware {

 private static ApplicationContext context;
 private LibraryService libraryService;

         @Override
 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
        libraryService = context.getBean(LibraryService.class);   
       }


            Grid<Book> bookGrid = new Grid<>(Book.class);
            VerticalLayout verticalLayout = new VerticalLayout();


            public GridLayout(){
                createMainLayout();
                createGrid();
            }

            private void createMainLayout() {
                setCompositionRoot(verticalLayout);
            }

            private void createGrid() {
                bookGrid = new Grid<>(Book.class);
                verticalLayout.addComponent(bookGrid);
                List<Book> books = libraryService.getAllBooks();
                bookGrid.setItems(books);
                bookGrid.removeAllColumns();
                bookGrid.addColumn(Book::getTitle).setCaption("TITLE");
                bookGrid.addColumn(Book::getAuthor).setCaption("AUTHOR");
                bookGrid.addColumn(Book::getYear).setCaption("YEAR");

                verticalLayout.addComponent(bookGrid);
            }
        }

但它需要将相同的图像加载到内存中两次,我不希望由于内存问题。我想加载图像一次并将其显示为两个图像视图。我能做些什么来实现它? / p>

5 个答案:

答案 0 :(得分:5)

使用滑行时无需担心内存问题,因为滑翔有自己的缓存系统来优化内存请阅读此doc

Glide提供了许多选项,允许您根据每个请求选择负载与Glide缓存的交互方式。

磁盘缓存策略 DiskCacheStrategy可以与diskCacheStrategy方法一起应用于单个请求。可用的策略允许您阻止负载使用或写入磁盘缓存,或者选择仅缓存支持加载的未修改的原始数据,仅缓存由负载生成的转换后的缩略图,或两者。

默认策略AUTOMATIC尝试对本地和远程图像使用最佳策略。当您加载远程数据(例如来自URL)时,AUTOMATIC将仅存储支持负载的未修改数据,因为与调整磁盘上已有数据相比,下载远程数据的成本很高。对于本地数据,AUTOMATIC将仅存储转换的缩略图,因为如果您需要生成第二个缩略图大小或类型,则检索原始数据很便宜。

申请DiskCacheStrategy

GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView);

仅从缓存加载 在某些情况下,如果图像尚未存在于缓存中,则可能需要加载失败。为此,您可以基于每个请求使用onlyRetrieveFromCache方法:

GlideApp.with(fragment)
  .load(url)
  .onlyRetrieveFromCache(true)
  .into(imageView);

如果在内存缓存或磁盘缓存中找到图像,则会加载该图像。否则,如果此选项设置为true,则加载将失败。

答案 1 :(得分:2)

  

如果您使用的是Glide的最新版本,请创建RequestOptions

private RequestOptions simpleOptions = new RequestOptions()
            .centerCrop()
            .placeholder(R.color.color_gray)
            .error(R.color.color_gray)
            .diskCacheStrategy(DiskCacheStrategy.RESOURCE);
  

使用RequestOptions加载具有设置属性的图像

Glide.with(context)
                .load(url)
                .apply(simpleOptions)
                .into(imageView);

答案 2 :(得分:1)

或者也许是这样...

RequestBuilder<Drawable> builder = Glide.with(this).load(drawableResId);
builder.into(imageView0)
builder.into(imageView1)

答案 3 :(得分:0)

试试这个......

setImage(R.drawable.header_image,imageView ,imageView2 );


void setImage(int image, ImageView... imageView) {
    for (ImageView imageView : imageView) {

        if (imageView != null) {

            Glide.with(this).load(image).into(imageView);

        }

    }

}

答案 4 :(得分:0)

您可以使用以下代码加载图像一次,并将其显示在多个图像视图中。

Glide.with(this)
    .asBitmap()
    .load(R.drawable.header_image)
    .into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
            imageview.setImageBitmap(resource);
            imageview2.setImageBitmap(resource);
        }
    });