GlideEngine.kt 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package com.xuqm.base.common
  2. import android.content.Context
  3. import android.graphics.Bitmap
  4. import android.graphics.PointF
  5. import android.graphics.drawable.Drawable
  6. import android.view.View
  7. import android.widget.ImageView
  8. import androidx.annotation.NonNull
  9. import androidx.core.graphics.drawable.RoundedBitmapDrawable
  10. import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory
  11. import com.bumptech.glide.Glide
  12. import com.bumptech.glide.request.RequestOptions
  13. import com.bumptech.glide.request.target.BitmapImageViewTarget
  14. import com.bumptech.glide.request.target.ImageViewTarget
  15. import com.luck.picture.lib.engine.ImageEngine
  16. import com.luck.picture.lib.listener.OnImageCompleteCallback
  17. import com.luck.picture.lib.tools.MediaUtils
  18. import com.luck.picture.lib.widget.longimage.ImageSource
  19. import com.luck.picture.lib.widget.longimage.ImageViewState
  20. import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView
  21. import com.xuqm.base.R
  22. import org.jetbrains.annotations.NotNull
  23. class GlideEngine private constructor() : ImageEngine {
  24. /**
  25. * 加载图片
  26. *
  27. * @param context
  28. * @param url
  29. * @param imageView
  30. */
  31. override fun loadImage(
  32. @NotNull context: Context,
  33. @NotNull url: String,
  34. @NotNull imageView: ImageView
  35. ) {
  36. Glide.with(context)
  37. .load(url)
  38. .into(imageView)
  39. }
  40. /**
  41. * 加载网络图片适配长图方案
  42. * # 注意:此方法只有加载网络图片才会回调
  43. *
  44. * @param context
  45. * @param url
  46. * @param imageView
  47. * @param longImageView
  48. * @param callback 网络图片加载回调监听 {link after version 2.5.1 Please use the #OnImageCompleteCallback#}
  49. */
  50. override fun loadImage(
  51. @NotNull context: Context, @NotNull url: String,
  52. @NotNull imageView: ImageView,
  53. longImageView: SubsamplingScaleImageView, callback: OnImageCompleteCallback
  54. ) {
  55. Glide.with(context)
  56. .asBitmap()
  57. .load(url)
  58. .into(object : ImageViewTarget<Bitmap?>(imageView) {
  59. override fun onLoadStarted(@NonNull placeholder: Drawable?) {
  60. super.onLoadStarted(placeholder)
  61. callback.onShowLoading()
  62. }
  63. override fun onLoadFailed(@NonNull errorDrawable: Drawable?) {
  64. super.onLoadFailed(errorDrawable)
  65. callback.onHideLoading()
  66. }
  67. override fun setResource(@NonNull resource: Bitmap?) {
  68. callback.onHideLoading()
  69. if (resource != null) {
  70. val eqLongImage: Boolean = MediaUtils.isLongImg(
  71. resource.width,
  72. resource.height
  73. )
  74. longImageView.visibility = if (eqLongImage) View.VISIBLE else View.GONE
  75. imageView.visibility = if (eqLongImage) View.GONE else View.VISIBLE
  76. if (eqLongImage) {
  77. // 加载长图
  78. longImageView.isQuickScaleEnabled = true
  79. longImageView.isZoomEnabled = true
  80. longImageView.isPanEnabled = true
  81. longImageView.setDoubleTapZoomDuration(100)
  82. longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP)
  83. longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER)
  84. longImageView.setImage(
  85. ImageSource.bitmap(resource),
  86. ImageViewState(0f, PointF(0f, 0f), 0)
  87. )
  88. } else {
  89. // 普通图片
  90. imageView.setImageBitmap(resource)
  91. }
  92. }
  93. }
  94. })
  95. }
  96. /**
  97. * 加载网络图片适配长图方案
  98. * # 注意:此方法只有加载网络图片才会回调
  99. *
  100. * @param context
  101. * @param url
  102. * @param imageView
  103. * @param longImageView
  104. * @ 已废弃
  105. */
  106. override fun loadImage(
  107. @NotNull context: Context, @NotNull url: String,
  108. @NotNull imageView: ImageView,
  109. longImageView: SubsamplingScaleImageView
  110. ) {
  111. Glide.with(context)
  112. .asBitmap()
  113. .load(url)
  114. .into(object : ImageViewTarget<Bitmap?>(imageView) {
  115. override fun setResource(@NonNull resource: Bitmap?) {
  116. if (resource != null) {
  117. val eqLongImage: Boolean = MediaUtils.isLongImg(
  118. resource.width,
  119. resource.height
  120. )
  121. longImageView.visibility = if (eqLongImage) View.VISIBLE else View.GONE
  122. imageView.visibility = if (eqLongImage) View.GONE else View.VISIBLE
  123. if (eqLongImage) {
  124. // 加载长图
  125. longImageView.isQuickScaleEnabled = true
  126. longImageView.isZoomEnabled = true
  127. longImageView.isPanEnabled = true
  128. longImageView.setDoubleTapZoomDuration(100)
  129. longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP)
  130. longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER)
  131. longImageView.setImage(
  132. ImageSource.bitmap(resource),
  133. ImageViewState(0f, PointF(0f, 0f), 0)
  134. )
  135. } else {
  136. // 普通图片
  137. imageView.setImageBitmap(resource)
  138. }
  139. }
  140. }
  141. })
  142. }
  143. /**
  144. * 加载相册目录
  145. *
  146. * @param context 上下文
  147. * @param url 图片路径
  148. * @param imageView 承载图片ImageView
  149. */
  150. override fun loadFolderImage(
  151. @NotNull context: Context,
  152. @NotNull url: String,
  153. @NotNull imageView: ImageView
  154. ) {
  155. Glide.with(context)
  156. .asBitmap()
  157. .load(url)
  158. .override(180, 180)
  159. .centerCrop()
  160. .sizeMultiplier(0.5f)
  161. .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder))
  162. .into(object : BitmapImageViewTarget(imageView) {
  163. override fun setResource(resource: Bitmap?) {
  164. val circularBitmapDrawable: RoundedBitmapDrawable =
  165. RoundedBitmapDrawableFactory.create(context.resources, resource)
  166. circularBitmapDrawable.cornerRadius = 8f
  167. imageView.setImageDrawable(circularBitmapDrawable)
  168. }
  169. })
  170. }
  171. /**
  172. * 加载gif
  173. *
  174. * @param context 上下文
  175. * @param url 图片路径
  176. * @param imageView 承载图片ImageView
  177. */
  178. override fun loadAsGifImage(
  179. @NotNull context: Context, @NotNull url: String,
  180. @NotNull imageView: ImageView
  181. ) {
  182. Glide.with(context)
  183. .asGif()
  184. .load(url)
  185. .into(imageView)
  186. }
  187. /**
  188. * 加载图片列表图片
  189. *
  190. * @param context 上下文
  191. * @param url 图片路径
  192. * @param imageView 承载图片ImageView
  193. */
  194. override fun loadGridImage(
  195. @NotNull context: Context,
  196. @NotNull url: String,
  197. @NotNull imageView: ImageView
  198. ) {
  199. Glide.with(context)
  200. .load(url)
  201. .override(200, 200)
  202. .centerCrop()
  203. .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder))
  204. .into(imageView)
  205. }
  206. companion object {
  207. private var instance: GlideEngine? = null
  208. fun createGlideEngine(): GlideEngine? {
  209. if (null == instance) {
  210. synchronized(GlideEngine::class.java) {
  211. if (null == instance) {
  212. instance = GlideEngine()
  213. }
  214. }
  215. }
  216. return instance
  217. }
  218. }
  219. }