在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ 目標
配置
Generated API
轉(zhuǎn)換
選項
過渡效果
關(guān)于Glide
緩存
調(diào)試
目標
占位符
下載和設(shè)置
入門指南

目標

Glide中的目標作為請求跟請求者之間的傳遞者。目標負責顯示占位符,加載的資源以及為每個請求確定合適的尺寸。最常用目標是使用ImageView顯示占位符,Drawable和Bitmap的ImageViewTarget。用戶還可以實現(xiàn)自己的目標,或者對任何可用的基類進行子類化。

指定目標

into(Target)方法不僅用于啟動每個請求,同時也可以指定將要接收請求結(jié)果的目標。Glide提供了一個輔助方法給into(ImageView),其采用ImageView并把它包裝在目標于適合所請求的資源類型。

為了方便使用自定義目標,這些into()方法返回提供給他們的目標:

Target<Bitmap> target = Glide.with(fragment)
        .asBitmap()
        .load(url)
        .into(imageView);
...
// Some time later:
Glide.with(fragment).clear(target);

目標和自動取消

目標可以并且通常應(yīng)該被重新用于相同的地方顯示的每個后續(xù)請求。重新使用目標允許Glide在新加載啟動時自動取消并且重新使用之前負載的資源。未能重新使用目標可能會導(dǎo)致之前請求中的資源替換較新的請求。

自定義目標

重新使用自定義目標的一種簡單方法是簡單地將其作為實例變量:

private class WidgetHolder {
  private final Fragment fragment;
  private final Target<Widget> widgetTarget;

  public WidgetHolder(Fragment fragment, Widget widget) {
    this.fragment = fragment;
    widgetTarget = new CustomWidgetTarget(widget);
  }

  public void showInWidget(Uri uri) {
    Glide.with(fragment)
        .load(uri)
        .into(widgetTarget);
  }
}

Glide能夠使用getRequest()和setRequest()方法查找和取消對目標的請求。這意味著所有自定義的目標都必須實現(xiàn)這些方法。最簡單的方法是進行子類化BaseTarget。

ViewTargets

一些自定義的目標還可以提供更智能的getRequest()和setRequest()實現(xiàn),避免嚴格要求重新使用目標。例如,ViewTarget使用Android Framework的getTag()和setTag()方法:

@Override
public Request getRequest() {
    return (Request) view.getTag();
}

@Override
public void setRequest(Request request) {
    view.setTag(request);
}

由于標簽是View的屬性,因此新加載的ViewTargets可以查找和取消/重新使用先前ViewTargets的請求。因此,當使用into(ImageView)或ViewTarget的子類加載到視圖中時,您可以為每個加載傳遞新的目標:

@Override
public void onBindViewHolder(ViewHolder vh, int position) {
  int resourceId = resourceIds.get(position)
  Glide.with(fragment)
      .load(resourceId)
      .into(new CustomViewTarget(vh.imageView));

尺寸

默認情況下,Glide使用由Targets提供的getSize()大小作為請求的目標大小。這樣做可以讓Glide選擇適當?shù)膗rl,downsample,crop和轉(zhuǎn)換適當?shù)膱D像,以盡量減少內(nèi)存使用,并確保負載盡可能快。

最簡單的實現(xiàn)方式是在getSize()方法中立即調(diào)用回調(diào)函數(shù):

@Override
public void getSize(SizeReadyCallback cb) {
  cb.onSizeReady(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
}

您還可以將尺寸傳遞給您的Target的構(gòu)造函數(shù),并將這些尺寸提供給回調(diào):

public class CustomTarget<T> implements Target<T> {
  private final int width;
  private final int height;

  public CustomTarget(int width, int height) {
    this.width = width;
    this.height = height;
  }

  ...

  @Override
  public void getSize(SizeReadyCallback cb) {
    cb.onSizeReady(width, height);
  }
}

查看目標

ViewTarget實現(xiàn)了getSize()方法,通過檢查View的屬性或者使用onPreDrawListener在渲染之前立即測量視圖來實現(xiàn)。我們采用下面的邏輯:

  1. 如果任一視圖的尺寸設(shè)置的值>0,則使用這些尺寸。
  2. 如果任一視圖的尺寸設(shè)置成WRAP_CONTENT,則使用屏幕的寬度或高度。
  3. 如果至少有一個視圖的尺寸的值<=0而不是WRAP_CONTENT,則添加一個OnPreDrawListener來監(jiān)聽布局。

WRAP_CONTENT

請注意,Glide不能很好的處理WRAP_CONTENT,這是因為對于我們來說很難清楚用戶的意圖,特別是要求轉(zhuǎn)換時。

我們可以看作WRAP_CONTENT是用戶請求原始的未修改的圖像,但是這樣做在我們加載大圖像時有內(nèi)存溢出的風險。另外,特別是視圖不會脫離屏幕,因此Android框架可能會最終縮小任何加載成功的全分辨率圖像。

使用屏幕尺寸,我們至少可以對超大圖像進行降低采樣,而不會完全忽略用戶的請求。

應(yīng)用視圖大小

一般來說,當在其加載的視圖上設(shè)置顯示dp大小時,Glide提供了最快的和最可預(yù)測的結(jié)果。然而,當不可能這樣時,Glide還為布局權(quán)重,MATCH_PARENT和其他相對尺寸提供了強大的支持OnPreDrawListeners。最后,如果這些都沒有設(shè)置,Glide應(yīng)該為WRAP_CONTENT提供了合理的行為。

備選方案

如果在任何情況下,Glide似乎都會使View大小錯誤,您可以隨時通過擴展ViewTarget和實現(xiàn)自己的邏輯來手動覆蓋大小,或者通過使用RequestOptions中的override()方法。

下一篇:配置