首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将视图(shimmer)用作imageView的占位符(Glide)

如何将视图(shimmer)用作imageView的占位符(Glide)
EN

Stack Overflow用户
提问于 2020-04-07 16:50:08
回答 3查看 4.4K关注 0票数 13

我正在使用Glide将图片加载到我的imageView (在一个回收器视图中):

代码语言:javascript
复制
Glide.with(image.context).load(url)
        .error(context.getDrawable(R.drawable.placeholder))
        .into(image)

我看到Glide库还有一个“占位符”函数,它提供了在图像仍在加载时加载要显示的可绘制内容的功能。

另一方面,对于整个recyclerView,我使用Facebook Shimmer库来显示正在加载回收视图。

看看我的应用,一切都很好。然而,在清除闪光器(获取数据)和显示图像之间仍有一段时间间隔。这正是需要占位符的时候。我想知道,有没有办法把闪光灯也用作imageView的占位符呢?Glide中的占位符功能只支持Drawable,而Shimmer是一个视图。

有没有办法把Shimmer转换成Drawable?或者GIF?或者其他的建议?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-07 17:54:00

感谢Mike上面的评论:有一个ShimmerDrawable类,你可以在这个类中构建一个可以在Glide中使用的拖拽视图:

代码语言:javascript
复制
private val shimmer = Shimmer.AlphaHighlightBuilder()// The attributes for a ShimmerDrawable is set by this builder
    .setDuration(1800) // how long the shimmering animation takes to do one full sweep
    .setBaseAlpha(0.7f) //the alpha of the underlying children
    .setHighlightAlpha(0.6f) // the shimmer alpha amount
    .setDirection(Shimmer.Direction.LEFT_TO_RIGHT)
    .setAutoStart(true)
    .build()

// This is the placeholder for the imageView
    val shimmerDrawable = ShimmerDrawable().apply {
        setShimmer(shimmer)
    }


Glide.with(image.context).load(url)
        .placeholder(shimmerDrawable)
        .error(context.getDrawable(R.drawable.placeholder))
        .into(image)
票数 21
EN

Stack Overflow用户

发布于 2020-05-04 09:14:10

我已经开发了一个库来方便地添加闪光/骨架加载效果。https://github.com/AgnaldoNP/AGSkeletonLoading

README.md上有关于如何使用它的说明。你不需要添加一堆布局来模拟骨架,它是自动计算的。用于显示骨架的布局与显示内容相同。

如果在布局文件上使用SkeletonImageView,则只需调用startLoading()和stopLoading()来控制动画。我希望我对你有所帮助

票数 2
EN

Stack Overflow用户

发布于 2021-06-10 20:52:13

在我的例子中,我想要一个圆角的可抽屉作为占位符,这是库不支持的,我发现你可以使用Google Material Designs中的ShapeableImageView实现这一点。

1.将谷歌Material Designs添加到1.2.1或更高版本的dependencies 'com.google.android.material:material:1.2.1'中。

2.在列表项视图中,将您的ImageView定义为如下所示的ShapeableImageView:

代码语言:javascript
复制
<com.google.android.material.imageview.ShapeableImageView
   android:id="@+id/shapeImageView"
   android:layout_width="70dp"
   android:layout_height="70dp"
   android:background="@android:color/holo_red_dark"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent"/>

3.在RecyclerView.ViewHolder类中,将上面ShapeableImageView的ShapeAppearanceModel设置为CornerFamily.ROUNDED,并将ShimmerDrawable作为占位符加载到Glide中,如下所示:

代码语言:javascript
复制
//initialize shimmer
val shimmer = Shimmer.ColorHighlightBuilder()
     .setBaseColor(ContextCompat.getColor(itemView.context, R.color.teal_200))
     .setBaseAlpha(0.7f)
     .setHighlightAlpha(0.7f)
     .setHighlightColor(ContextCompat.getColor(itemView.context, R.color.purple_700))
     .setDuration(1800)
     .setDirection(Shimmer.Direction.LEFT_TO_RIGHT)
     .setAutoStart(true)
     .build()

 //create ShimmerDrawable()
 val shimmerDrawable = ShimmerDrawable()
 shimmerDrawable.setShimmer(shimmer)

 //set the ShapeAppearanceModel to CornerFamily.ROUNDED and the radius in pixels
 val radius: Float = dpToPx(itemView.context, 15).toFloat();
 shapeImageView.setShapeAppearanceModel(shapeImageView.getShapeAppearanceModel()
                .toBuilder()
                .setAllCorners(CornerFamily.ROUNDED, radius)
                .build())

 //load url from Glide and add shimmerDrawable as placeholder
 Glide.with(itemView.context).load(item.url)
        .placeholder(shimmerDrawable)
        .into(shapeImageView)

使用帮助器类将半径从dp转换为像素

代码语言:javascript
复制
fun dpToPx(context: Context, dp: Int): Int {
  return (dp * context.resources.displayMetrics.density).toInt()
}

上面的结果将是:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61076174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档