Glide使用

1.Gradle引入

compile 'com.github.bumptech.glide:glide:3.7.0'

2.Glide最简单使用

Glide.with(PhotoPreviewsActivity.this).load(path).into(iv_show);


 2.1这里的with在源码里有4中类型 
* @see #with(android.app.Activity)
 * @see #with(android.app.Fragment)
 * @see #with(android.support.v4.app.Fragment)
 * @see #with(android.support.v4.app.FragmentActivity)
 *
 * @param context Any context, will not be retained.
 * @return A RequestManager for the top level application that can be used to start a load.
 */
public static RequestManager with(Context context) {
    RequestManagerRetriever retriever = RequestManagerRetriever.get();
    return retriever.get(context);
}

2.2这里的load参数在源码里给的可以是文件路径,uri或url
 * Returns a request builder to load the given {@link java.lang.String}.
 * signature.
 *
 * @see #fromString()
 * @see #load(Object)
 *
 * @param string A file path, or a uri or url handled by {@link com.bumptech.glide.load.model.UriLoader}.
 */
public DrawableTypeRequest<String> load(String string) {
    return (DrawableTypeRequest<String>) fromString().load(string);
}

2.3这里的into就是要显示的控件,但是在源码里有这样一句话,如果没有transformation,就会有默认的transformation,它的值是getScaleType(),如果不想用transformation,则使用dontTransform()。
 *     Note - If no transformation is set for this load, a default transformation will be applied based on the
 *     value returned from {@link android.widget.ImageView#getScaleType()}. To avoid this default transformation,
 *     use {@link #dontTransform()}.
 * </p>
 *
 * @param view {@inheritDoc}
 * @return {@inheritDoc}
 */
@Override
public Target<GlideDrawable> into(ImageView view) {
    return super.into(view);
}

3.Glide还有以下常用的设置:
  3.1 placeholder() 加载过程中的占位图,值可以是Drawable或resouceId
  3.2 error() 加载失败显示的图,值可以是Drawable或resouceId 
  3.3 override(int width,int height)设置加载图片的大小,值可以是Drawable或resouceId
  3.4 dontAnimate()设置淡入淡出的加载动画,其作用效果和crossFade(1000)一样,但是crossFade可以设置时间,也可以不设置
  3.5 animate()自定义动画
  3.6 priority(Priority.NORMAL) 设置优先级,优先级越高就会越先加载,其值可以取:
     public enum Priority { IMMEDIATE, HIGH, NORMAL, LOW, priority, }
 3.7 asBitmap() 当成bitmap加载,如果是gif则停留在第一帧。
 3.8 skipMemoryCache(false)  跳过内存缓存。
 3.9 diskCacheStrategy(DiskCacheStrategy.NONE) 。设置磁盘缓存模式:它的值有以下几种:

public enum DiskCacheStrategy {
    /** Caches with both {@link #SOURCE} and {@link #RESULT}. */
    ALL(true, true), //缓存所有数据
    /** Saves no data to cache. */
    NONE(false, false), //不缓存数据
    /** Saves just the original data to cache. */
    SOURCE(true, false), //缓存源数据
    /** Saves the media item after all transformations to cache. */
    RESULT(false, true);//缓存转换后的数据

}

 3.10 thumbnail(0.1f)  设置缩略图
 3.11 asGif() 加载gif图片的时候使用,如果不是gif,则会加载失败
 3.12 Glide.get(this).clearDiskCache()  清理磁盘缓存,子线程中进行
 3.13 Glide.get(this).clearMemory()  清理内存缓存,子线程中进行

4.图片加载会闪烁

  去掉crossFade(1000) 和dontAnimate()动画

5.图片加载缓慢,而且会出现短暂的空白,还显示不全

 1.去掉crossFade(1000) 和dontAnimate()动画
  2.可以使用先加载缩略图thumbnail
  3.也可以使用placeholder(imgView.getDrawable()),先加载占位图,再加载要显示的图片
  4.我觉得不要跳过内存缓存skipMemoryCache(false)
   5.对于显示不全,可以对imageview设置scaleType为 centerCrop,因为比例不会变

//第一种缓存图片方式
void cacheImage(final String imgUrl,final ImageView imgView)
Glide.with(this).load(imgUrl).skipMemoryCache(false).placeholder(imgView.getDrawable()).priority (Priority.HIGH ).listener(new RequestListener<String, GlideDrawable>() {
    @Override
    public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
      //  Log.d("GlideLoad","onException"+"path="+imgUrl);
       cacheImage(imgUrl,imgView);
      //加载异常后的回调方法
        return false;
    }

    @Override
    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
      // Log.d("GlideLoad","onResourceReady"+"path="+imgUrl); 
      //加载完成后的回调方法
        return false;
    }
}).diskCacheStrategy(DiskCacheStrategy.SOURCE)/*.thumbnail(0.1f)*//*.crossFade(1000)*//*.dontAnimate()*/.into(imgView);
}



//第二种缓存图片方式
Glide.with(context) .load(imgUrl).downloadOnly(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL).get();

6.Glide的磁盘缓存地址:

 

<think>好的,用户想了解在Android中使用Glide库实现fitXY图片缩放的方法,并且需要示例。首先,我需要回忆Glide的相关知识,特别是关于图片缩放的部分。记得Glide提供了多种图片缩放选项,类似于Android ImageView的scaleType属性。用户提到的fitXY应该对应Glide中的某个选项,但具体是哪个呢? 接下来,我需要确认Glide中如何设置scaleType。根据之前的知识,Glide的transform方法可以用来应用各种变换,比如CenterCrop、FitCenter等。但直接设置scaleType可能不是通过transform,而是通过override方法指定目标尺寸,再结合缩放类型。或者,可能需要在ImageView上直接设置scaleType为fitXY,同时确保Glide加载的图片适配这个设置。 然后,用户提供的引用中有提到引用[1]使用android:scaleType="fitXY"来拉伸图片,但这是在ImageView的XML属性中设置的。可能用户想知道如何在Glide中实现同样的效果。这时候需要考虑Glide是否支持强制图片拉伸填充,而不保持宽高比。通常,Glide的默认行为可能不是fitXY,而是类似centerCrop或fitCenter,所以需要找到对应的选项。 另外,引用[3]提到基于Glide的二次封装,可能涉及到自定义的缩放方式,但用户需要的是原生Glide的方法。需要确保回答中使用的是Glide本身的API,而不是二次封装的库。 可能正确的做法是,使用Glide的override方法指定目标尺寸,然后使用dontTransform()来避免Glide自动应用变换,这样ImageView的scaleType设置就能生效。或者,使用fitCenter()或centerCrop(),但这些可能不符合fitXY的需求。但fitXY是拉伸填满,可能需要在ImageView上设置scaleType,并确保Glide不进行任何变换,让图片直接适应ImageView的尺寸。 需要验证这种方法的正确性。例如,在XML中设置ImageView的scaleType为fitXY,然后使用Glide加载图片时不应用任何变换,这样图片应该会被拉伸填充。可能还需要使用override指定具体的宽高,或者让Glide根据ImageView的尺寸自动调整。 因此,正确的步骤可能包括:1. 在ImageView的XML中设置android:scaleType="fitXY";2. 在Glide加载时使用override指定目标尺寸,或者确保Glide不应用任何变换。可能需要使用dontTransform()方法,因为Glide默认可能会应用某些变换。 另外,需要提供一个代码示例,展示如何在Glide中实现这一点。例如: Glide.with(context) .load(imageUrl) .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) .dontTransform() .into(imageView); 但这样可能不会拉伸,而是保持原图大小。或者,可能需要设置override为ImageView的尺寸,并配合fitXY的scaleType。比如: Glide.with(context) .load(imageUrl) .override(imageView.width, imageView.height) .dontTransform() .into(imageView); 但获取ImageView的宽高可能在加载时尚未确定,导致问题。因此,可能更可靠的方式是直接在XML中设置ImageView的scaleType为fitXY,并且让Glide加载时不进行变换,这样ImageView会自动处理拉伸。例如: XML: <ImageView android:id="@+id/image_view" android:layout_width="200dp" android:layout_height="100dp" android:scaleType="fitXY"/> Java代码: Glide.with(context) .load(imageUrl) .dontTransform() .into(imageView); 这样,Glide不会应用任何变换,而ImageView会根据设置的fitXY进行拉伸填充。但需要确认Glide默认是否会调整图片尺寸以适应ImageView。如果Glide默认调整大小,可能需要使用override,或者可能不需要,因为ImageView的scaleType已经处理了拉伸。 另外,可能还需要注意图片的缩放质量,使用diskCacheStrategy或其他方法来优化显示效果。但用户主要关心的是如何实现fitXY,所以示例应简洁明了。 最后,根据引用[1],用户可能已经知道在XML中设置scaleType,但需要Glide配合正确加载,确保图片被正确拉伸。因此,回答应强调两者的结合使用:ImageView的scaleType设置和Glide的dontTransform方法,或者适当的override。</think>### 如何在Android中使用Glide实现`fitXY`图片缩放? 在Android中,Glide默认会根据`ImageView`的`scaleType`属性自动处理图片缩放。若需要实现类似`fitXY`的拉伸填充效果,需结合`ImageView`的XML属性设置和Glide的配置。以下是具体步骤和示例: --- #### **步骤说明** 1. **在XML中定义ImageView的`scaleType`** 设置`android:scaleType="fitXY"`,强制图片拉伸填充控件区域,忽略原始宽高比: ```xml <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="fitXY" /> ``` 2. **在Glide中禁用默认变换** 使用`dontTransform()`方法阻止Glide自动应用`FitCenter`或`CenterCrop`等默认变换,确保`ImageView`的`fitXY`生效: ```kotlin Glide.with(context) .load(imageUrl) .dontTransform() // 禁用Glide的自动变换 .into(imageView) ``` 3. **(可选)指定加载尺寸** 若需更精确控制,可用`override(width, height)`强制设置加载尺寸: ```kotlin Glide.with(context) .load(imageUrl) .override(300, 200) // 指定目标宽高 .dontTransform() .into(imageView) ``` --- #### **注意事项** - **图片变形问题**:`fitXY`会拉伸图片,可能导致宽高比失调,需根据场景权衡[^1]。 - **性能优化**:频繁拉伸大图可能影响性能,建议结合`thumbnail()`加载缩略图或压缩图片尺寸[^2]。 --- #### **完整示例** ```kotlin // XML布局 <ImageView android:id="@+id/stretched_image" android:layout_width="match_parent" android:layout_height="150dp" android:scaleType="fitXY" /> // Kotlin代码 val imageView: ImageView = findViewById(R.id.stretched_image) Glide.with(this) .load("https://example.com/image.jpg") .dontTransform() .into(imageView) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值