parent
097a194931
commit
23ecb48057
@ -0,0 +1,259 @@ |
||||
package io.legado.app.help |
||||
|
||||
import android.content.Context |
||||
import android.graphics.Bitmap |
||||
import android.graphics.drawable.Drawable |
||||
import android.net.Uri |
||||
import android.widget.ImageView |
||||
import androidx.annotation.DrawableRes |
||||
import com.bumptech.glide.Glide |
||||
import com.bumptech.glide.RequestBuilder |
||||
import com.bumptech.glide.RequestManager |
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy |
||||
import com.bumptech.glide.load.resource.bitmap.* |
||||
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions |
||||
import com.bumptech.glide.load.resource.gif.GifDrawable |
||||
import com.bumptech.glide.request.RequestOptions |
||||
import com.bumptech.glide.request.transition.Transition |
||||
import java.io.File |
||||
|
||||
object ImageLoader { |
||||
|
||||
fun load(context: Context, url: String?): ImageLoadBuilder<String> { |
||||
return ImageLoadBuilder(context, url) |
||||
} |
||||
|
||||
fun load(context: Context, @DrawableRes resId: Int?): ImageLoadBuilder<Int> { |
||||
return ImageLoadBuilder(context, resId) |
||||
} |
||||
|
||||
fun load(context: Context, file: File?): ImageLoadBuilder<File> { |
||||
return ImageLoadBuilder(context, file) |
||||
} |
||||
|
||||
fun load(context: Context, uri: Uri?): ImageLoadBuilder<Uri> { |
||||
return ImageLoadBuilder(context, uri) |
||||
} |
||||
|
||||
fun load(context: Context, drawable: Drawable?): ImageLoadBuilder<Drawable> { |
||||
return ImageLoadBuilder(context, drawable) |
||||
} |
||||
|
||||
fun load(context: Context, bitmap: Bitmap?): ImageLoadBuilder<Bitmap> { |
||||
return ImageLoadBuilder(context, bitmap) |
||||
} |
||||
|
||||
fun load(context: Context, bytes: ByteArray?): ImageLoadBuilder<ByteArray> { |
||||
return ImageLoadBuilder(context, bytes) |
||||
} |
||||
|
||||
|
||||
fun with(context: Context): ImageLoadBuilder<Any> { |
||||
return ImageLoadBuilder(context) |
||||
} |
||||
|
||||
fun clear(imageView: ImageView) { |
||||
with(imageView.context).clear(imageView) |
||||
} |
||||
|
||||
class ImageLoadBuilder<S> constructor(context: Context, private var source: S? = null) { |
||||
|
||||
private val manager: RequestManager = Glide.with(context) |
||||
private var requestOptions: RequestOptions = RequestOptions() |
||||
private var crossFade: Boolean = false |
||||
private var noCache: Boolean = false |
||||
|
||||
fun load(source: S): ImageLoadBuilder<S> { |
||||
this.source = source |
||||
return this |
||||
} |
||||
|
||||
fun toRound(corner: Int): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.transform(RoundedCorners(corner)) |
||||
return this |
||||
} |
||||
|
||||
fun toCropRound(corner: Int): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.transforms(CenterCrop(), RoundedCorners(corner)) |
||||
return this |
||||
} |
||||
|
||||
fun toCircle(): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.transform(CircleCrop()) |
||||
return this |
||||
} |
||||
|
||||
fun centerInside(): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.transform(CenterInside()) |
||||
return this |
||||
} |
||||
|
||||
fun fitCenter(): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.transform(FitCenter()) |
||||
return this |
||||
} |
||||
|
||||
fun centerCrop(): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.transform(CenterCrop()) |
||||
return this |
||||
} |
||||
|
||||
fun crossFade(): ImageLoadBuilder<S> { |
||||
crossFade = true |
||||
return this |
||||
} |
||||
|
||||
fun noCache(): ImageLoadBuilder<S> { |
||||
noCache = true |
||||
return this |
||||
} |
||||
|
||||
fun placeholder(placeholder: Drawable): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.placeholder(placeholder) |
||||
return this |
||||
} |
||||
|
||||
fun placeholder(@DrawableRes resId: Int): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.placeholder(resId) |
||||
return this |
||||
} |
||||
|
||||
fun error(drawable: Drawable): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.error(drawable) |
||||
return this |
||||
} |
||||
|
||||
fun error(@DrawableRes resId: Int): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.error(resId) |
||||
return this |
||||
} |
||||
|
||||
fun override(width: Int, height: Int): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.override(width, height) |
||||
return this |
||||
} |
||||
|
||||
fun override(size: Int): ImageLoadBuilder<S> { |
||||
requestOptions = requestOptions.override(size) |
||||
return this |
||||
} |
||||
|
||||
fun clear(imageView: ImageView) { |
||||
manager.clear(imageView) |
||||
} |
||||
|
||||
fun downloadOnly(target: ImageViewTarget<File>) { |
||||
manager.downloadOnly().load(source).into(Target(target)) |
||||
} |
||||
|
||||
fun setAsDrawable(imageView: ImageView) { |
||||
asDrawable().into(imageView) |
||||
} |
||||
|
||||
fun setAsDrawable(target: ImageViewTarget<Drawable>) { |
||||
asDrawable().into(Target(target)) |
||||
} |
||||
|
||||
fun setAsBitmap(imageView: ImageView) { |
||||
asBitmap().into(imageView) |
||||
} |
||||
|
||||
fun setAsBitmap(target: ImageViewTarget<Bitmap>) { |
||||
asBitmap().into(Target(target)) |
||||
} |
||||
|
||||
fun setAsGif(imageView: ImageView) { |
||||
asGif().into(imageView) |
||||
} |
||||
|
||||
fun setAsGif(target: ImageViewTarget<GifDrawable>) { |
||||
asGif().into(Target(target)) |
||||
} |
||||
|
||||
fun setAsFile(imageView: ImageView) { |
||||
asFile().into(imageView) |
||||
} |
||||
|
||||
fun setAsFile(target: ImageViewTarget<File>) { |
||||
asFile().into(Target(target)) |
||||
} |
||||
|
||||
private fun asDrawable(): RequestBuilder<Drawable> { |
||||
var builder: RequestBuilder<Drawable> = ensureOptions(manager.asDrawable().load(source)) |
||||
|
||||
if (crossFade) { |
||||
builder = builder.transition(DrawableTransitionOptions.withCrossFade()) |
||||
} |
||||
|
||||
return builder |
||||
} |
||||
|
||||
private fun asBitmap(): RequestBuilder<Bitmap> { |
||||
var builder: RequestBuilder<Bitmap> = ensureOptions(manager.asBitmap().load(source)) |
||||
|
||||
if (crossFade) { |
||||
builder = builder.transition(BitmapTransitionOptions.withCrossFade()) |
||||
} |
||||
|
||||
return builder |
||||
} |
||||
|
||||
private fun asGif(): RequestBuilder<GifDrawable> { |
||||
var builder: RequestBuilder<GifDrawable> = ensureOptions(manager.asGif().load(source)) |
||||
|
||||
if (crossFade) { |
||||
builder = builder.transition(DrawableTransitionOptions.withCrossFade()) |
||||
} |
||||
|
||||
return builder |
||||
} |
||||
|
||||
private fun asFile(): RequestBuilder<File> { |
||||
return manager.asFile().load(source) |
||||
} |
||||
|
||||
private fun <ResourceType> ensureOptions(builder: RequestBuilder<ResourceType>): RequestBuilder<ResourceType> { |
||||
return builder.apply(requestOptions.diskCacheStrategy(if (noCache) DiskCacheStrategy.NONE else DiskCacheStrategy.RESOURCE)) |
||||
} |
||||
|
||||
private inner class Target<R> constructor(private val target: ImageViewTarget<R>) : |
||||
com.bumptech.glide.request.target.ImageViewTarget<R>(target.view) { |
||||
|
||||
init { |
||||
if (this.target.waitForLayout) { |
||||
waitForLayout() |
||||
} |
||||
} |
||||
|
||||
override fun onResourceReady(resource: R, transition: Transition<in R>?) { |
||||
if (!target.onResourceReady(resource)) { |
||||
super.onResourceReady(resource, transition) |
||||
} |
||||
} |
||||
|
||||
override fun setResource(resource: R?) { |
||||
target.setResource(resource) |
||||
} |
||||
} |
||||
} |
||||
|
||||
abstract class ImageViewTarget<R>(val view: ImageView) { |
||||
internal var waitForLayout: Boolean = false |
||||
|
||||
fun waitForLayout(): ImageViewTarget<R> { |
||||
waitForLayout = true |
||||
return this |
||||
} |
||||
|
||||
fun setResource(resource: R?) { |
||||
|
||||
} |
||||
|
||||
fun onResourceReady(resource: R?): Boolean { |
||||
return false |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
} |
Loading…
Reference in new issue