Skip to content

Commit

Permalink
增加DSL调用方式
Browse files Browse the repository at this point in the history
  • Loading branch information
forJrking committed Apr 7, 2021
1 parent 03c17b9 commit b696045
Show file tree
Hide file tree
Showing 13 changed files with 130 additions and 71 deletions.
36 changes: 28 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ImageExt
# ImageExt 参考Coil对Glide封装实现

### Glide封装实现, 主要为ImageView添加扩展函数来简化常见图片加载api [![](https://jitpack.io/v/forJrking/ImageExt.svg)](https://jitpack.io/#forJrking/ImageExt)
### 主要为ImageView添加扩展函数来简化常见图片加载api [![](https://jitpack.io/v/forJrking/ImageExt.svg)](https://jitpack.io/#forJrking/ImageExt)

![img](img/img.gif)

Expand Down Expand Up @@ -35,15 +35,29 @@ iv_7.loadRoundCornerImage(url, radius = 10, type = ImageOptions.CornerType.ALL)
//resize
iv_8.loadResizeImage(url, width = 400, height = 800)
//监听回调结果
iv.loadImage(url4, loadListener = object : OnImageListener {
override fun onSuccess(drawable: Drawable?) {
iv_9.loadImage(url4, requestListener = {
onSuccess {
Toast.makeText(application, R.string.load_success, Toast.LENGTH_LONG).show()
}
override fun onFail(msg: String?) {
Toast.makeText(application, R.string.load_failed, Toast.LENGTH_LONG).show()
onFail {
Toast.makeText(application, R.string.load_failed, Toast.LENGTH_SHORT).show()
}
})
//终极扩展 参数非常多必须使用可选参数方式调用
iv_8.load(url1) {
placeHolderResId = R.color.black
transformation = arrayOf(GrayscaleTransformation())
progressListener { isComplete, percentage, bytesRead, totalBytes ->
//加载进度
}
requestListener {
onSuccess {
}
onFail {
}
}
}
//超长扩展函数 选用建议用上面DSL方式
iv_9.loadImage(load = R.drawable.test, with = MainActivity@ this,
placeHolderResId = R.color.black,errorResId = R.color.blue,isAnim = false,
requestListener = object : OnImageListener {
Expand All @@ -67,8 +81,9 @@ ImageView.loadBlurImage(...)
ImageView.loadRoundCornerImage(...)
ImageView.loadCircleImage(...)
ImageView.loadBorderImage(...)
ImageView.load(load: Any?, options: ImageOptions.() -> Unit)//DSL

//终极扩展函数
//终极扩展函数 选用dsl方式
@JvmOverloads
fun ImageView.loadImage(load: Any?, with: Any? = this,
//占位图 错误图
Expand Down Expand Up @@ -123,5 +138,10 @@ onProgressListener: OnProgressListener? = null, requestListener: OnImageListener
app:cpv_progressTextVisible="false" />
```
## SelectImageView 仿微信图片点击响应
一个点击可以变为半透明的View,算是一个Bonus,所以放在了Sample里。逻辑十分简单,看代码即可。
一个点击可以变为半透明

## CircleImageView 圆形头像

一个圆形图片展示控件


1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'com.github.forJrking:KLuban:1.0.7'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
implementation project(path: ':libImage')
Expand Down
38 changes: 25 additions & 13 deletions app/src/main/java/me/demo/sample/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@ package me.demo.sample

import android.Manifest
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import android.view.View
import android.widget.Toast
import com.github.forjrking.image.*
import com.github.forjrking.image.core.ImageOptions
import com.github.forjrking.image.core.OnImageListener
import com.github.forjrking.image.glide.GlideImageLoader
import com.github.forjrking.image.glide.progress.OnProgressListener
import com.github.forjrking.image.glide.transformation.CircleWithBorderTransformation
import com.github.forjrking.image.glide.transformation.GrayscaleTransformation
import kotlinx.android.synthetic.main.activity_main.*
Expand Down Expand Up @@ -48,8 +45,9 @@ class MainActivity : AppCompatActivity() {
circleProgressView.visibility = View.VISIBLE
iv_0.postDelayed(
{
iv_0.loadProgressImage(url3, placeHolder = R.color.gray, progressListener = object : OnProgressListener {
override fun onProgress(isComplete: Boolean, percentage: Int, bytesRead: Long, totalBytes: Long) {
iv_0.load(url3) {
placeHolderResId = R.color.gray
progressListener { isComplete, percentage, bytesRead, totalBytes ->
// 跟踪进度
Log.d("TAG", "onProgress: $percentage")
if (isComplete) {
Expand All @@ -58,7 +56,7 @@ class MainActivity : AppCompatActivity() {
circleProgressView.progress = percentage
}
}
})
}

}, 500
)
Expand All @@ -67,22 +65,20 @@ class MainActivity : AppCompatActivity() {
iv_8.setOnClickListener { }
iv_1.loadImage(url1, placeHolder = R.color.blue)
//
iv_2.loadImage(url4, loadListener = object : OnImageListener {
override fun onSuccess(drawable: Drawable?) {
iv_2.loadImage(url4, requestListener = {
onSuccess {
Toast.makeText(application, R.string.load_success, Toast.LENGTH_LONG).show()
}

override fun onFail(msg: String?) {
Toast.makeText(application, R.string.load_failed, Toast.LENGTH_LONG).show()
onFail {
Toast.makeText(application, R.string.load_failed, Toast.LENGTH_SHORT).show()
}

})
//
iv_4.loadCircleImage(url1)
iv_5.loadBorderImage(url1, borderWidth = 10, borderColor = Color.RED)
iv_6.loadGrayImage(url1)
iv_7.loadRoundCornerImage(url1, radius = 40, type = ImageOptions.CornerType.ALL)
iv_8.loadBlurImage(url4)
// iv_8.loadBlurImage(url4)
// iv_8.loadResizeImage(url2, width = 400, height = 800)
//
// iv_9.loadImage(load = R.drawable.test, with = MainActivity@ this, placeHolderResId = R.color.black,
Expand All @@ -100,6 +96,21 @@ class MainActivity : AppCompatActivity() {
//
// }, transformation = *arrayOf(GrayscaleTransformation(), CircleWithBorderTransformation(borderWidth = 0, borderColor = 0)))
// iv_10.loadImage(url2, placeHolder = R.color.green)
iv_8.load(url1) {
placeHolderResId = R.color.black
transformation = arrayOf(GrayscaleTransformation(), CircleWithBorderTransformation(borderWidth = 0, borderColor = 0))
progressListener { isComplete, percentage, bytesRead, totalBytes ->
//加载进度
}
requestListener {
onSuccess {

}
onFail {

}
}
}
}

private fun hasStoragePermission(): Boolean {
Expand Down Expand Up @@ -129,4 +140,5 @@ class MainActivity : AppCompatActivity() {
companion object {
private const val WRITE_EXTERNAL_PERM = 123
}

}
39 changes: 19 additions & 20 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,12 @@
android:layout_marginBottom="15dp"
android:scaleType="centerCrop" />

<!-- <ImageView-->
<!-- android:id="@+id/iv_3"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="200dp"-->
<!-- android:layout_marginBottom="15dp"-->
<!-- android:scaleType="centerCrop" />-->
<!-- <ImageView-->
<!-- android:id="@+id/iv_3"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="200dp"-->
<!-- android:layout_marginBottom="15dp"-->
<!-- android:scaleType="centerCrop" />-->


<ImageView
Expand All @@ -83,27 +83,26 @@
android:id="@+id/iv_7"
android:layout_width="match_parent"
android:layout_height="200dp"
android:padding="15dp"
android:layout_marginBottom="15dp" />
android:layout_marginBottom="15dp"
android:padding="15dp" />

<me.demo.sample.SelectImageView
android:id="@+id/iv_8"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:layout_marginBottom="15dp" />

<!-- <me.demo.sample.SelectImageView-->
<!-- android:id="@+id/iv_9"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="200dp"-->
<!-- android:layout_marginBottom="15dp" />-->

<!-- <ImageView-->
<!-- android:id="@+id/iv_10"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="200dp"-->
<!-- android:layout_marginBottom="15dp" />-->
<!-- <me.demo.sample.SelectImageView-->
<!-- android:id="@+id/iv_9"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="200dp"-->
<!-- android:layout_marginBottom="15dp" />-->

<!-- <ImageView-->
<!-- android:id="@+id/iv_10"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="200dp"-->
<!-- android:layout_marginBottom="15dp" />-->

</LinearLayout>

Expand Down
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ buildscript {
repositories {
jcenter()
google()
maven { url 'https://jitpack.io' }
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.2'
Expand Down
Binary file modified img/img.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
26 changes: 19 additions & 7 deletions libImage/src/main/java/com/github/forjrking/image/ImageExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ fun ImageView.loadImage(@RawRes @DrawableRes drawableId: Int, @RawRes @DrawableR
}

@JvmOverloads
fun ImageView.loadImage(url: String?, @RawRes @DrawableRes placeHolder: Int = placeHolderImageView, @RawRes @DrawableRes errorId: Int = placeHolder, loadListener: OnImageListener? = null) {
fun ImageView.loadImage(url: String?, @RawRes @DrawableRes placeHolder: Int = placeHolderImageView, @RawRes @DrawableRes errorId: Int = placeHolder, requestListener: (OnImageListener.() -> Unit)? = null) {
this.loadImage(load = url, placeHolderResId = placeHolder, errorResId = errorId,
requestListener = loadListener)
requestListener = requestListener)
}

@JvmOverloads
Expand Down Expand Up @@ -107,8 +107,8 @@ fun ImageView.loadImage(load: Any?, with: Any? = this,
//自定义转换器
vararg transformation: Transformation<Bitmap>,
//进度监听,请求回调监听
onProgressListener: OnProgressListener? = null, requestListener: OnImageListener? = null) {
GlideImageLoader.loadImage(ImageOptions().also {
onProgressListener: OnProgressListener = null, requestListener: (OnImageListener.() -> Unit)? = null) {
val options = ImageOptions().also {
it.res = load
it.imageView = this
it.context = with
Expand Down Expand Up @@ -140,7 +140,19 @@ fun ImageView.loadImage(load: Any?, with: Any? = this,
it.roundRadius = roundRadius
it.cornerType = cornerType
it.transformation = transformation
it.onProgressListener = onProgressListener
it.requestListener = requestListener
})
it.progressListener(onProgressListener)
requestListener?.let { l -> it.requestListener(l) }
}
GlideImageLoader.loadImage(options)
}

/**模仿 coil**/
fun ImageView.load(load: Any?, options: (ImageOptions.() -> Unit)? = null) {
val imageOptions = ImageOptions().also {
it.res = load
it.imageView = this
}
GlideImageLoader.loadImage(options?.let {
imageOptions.also(options)
} ?: imageOptions)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import android.widget.ImageView
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes
import com.bumptech.glide.load.Transformation
import com.bumptech.glide.load.engine.cache.DiskCache
import com.github.forjrking.image.glide.progress.OnProgressListener

/**
Expand Down Expand Up @@ -134,10 +133,20 @@ class ImageOptions {
var transformation: Array<out Transformation<Bitmap>>? = null

/*** 网络进度监听器*/
var onProgressListener: OnProgressListener? = null
var onProgressListener: OnProgressListener = null
private set

fun progressListener(listener: OnProgressListener) {
this.onProgressListener = listener
}

/*** 加载监听*/
var requestListener: OnImageListener? = null
private set

fun requestListener(listener: OnImageListener.() -> Unit) {
requestListener = OnImageListener().also(listener)
}

/**
* 指定加载图片的大小
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@ package com.github.forjrking.image.core

import android.graphics.drawable.Drawable

interface OnImageListener {
class OnImageListener {
internal var onFailAction: ((String?) -> Unit)? = null
internal var onSuccessAction: ((Drawable?) -> Unit)? = null

fun onSuccess(drawable: Drawable?)
fun onFail(action: (String?) -> Unit) {
onFailAction = action
}

fun onFail(msg: String?)
fun onSuccess(action: (Drawable?) -> Unit) {
onSuccessAction = action
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -181,12 +181,12 @@ object GlideImageLoader {
options.requestListener?.let {
addListener(object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
options.requestListener?.onFail(e.toString())
options.requestListener?.onFailAction?.invoke(e.toString())
return false
}

override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
options.requestListener?.onSuccess(resource)
options.requestListener?.onSuccessAction?.invoke(resource)
return false
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@ class GlideImageViewTarget(view: ImageView?, var url: Any?) : DrawableImageViewT

override fun onLoadFailed(errorDrawable: Drawable?) {
url?.apply {
val onProgressListener = ProgressManager.getProgressListener(this.toString())
if (onProgressListener != null) {
onProgressListener.onProgress(false, 100, 0, 0)
ProgressManager.getProgressListener(this.toString())?.let {
it.invoke(false, 100, 0, 0)
ProgressManager.removeListener(this.toString())
}
}
Expand All @@ -20,9 +19,8 @@ class GlideImageViewTarget(view: ImageView?, var url: Any?) : DrawableImageViewT

override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
url?.apply {
val onProgressListener = ProgressManager.getProgressListener(this.toString())
if (onProgressListener != null) {
onProgressListener.onProgress(true, 100, 0, 0)
ProgressManager.getProgressListener(this.toString())?.let {
it.invoke(true, 100, 0, 0)
ProgressManager.removeListener(this.toString())
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.github.forjrking.image.glide.progress


interface OnProgressListener {
fun onProgress(isComplete: Boolean, percentage: Int, bytesRead: Long, totalBytes: Long)
}
//interface OnProgressListener {
// fun onProgress(isComplete: Boolean, percentage: Int, bytesRead: Long, totalBytes: Long)
//}

//给函数起别名 便于调用和书写
typealias OnProgressListener = ((isComplete: Boolean, percentage: Int, bytesRead: Long, totalBytes: Long) -> Unit)?
Loading

0 comments on commit b696045

Please sign in to comment.