Skip to content

Commit b696045

Browse files
committed
增加DSL调用方式
1 parent 03c17b9 commit b696045

File tree

13 files changed

+130
-71
lines changed

13 files changed

+130
-71
lines changed

README.md

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# ImageExt
1+
# ImageExt 参考Coil对Glide封装实现
22

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

55
![img](img/img.gif)
66

@@ -35,15 +35,29 @@ iv_7.loadRoundCornerImage(url, radius = 10, type = ImageOptions.CornerType.ALL)
3535
//resize
3636
iv_8.loadResizeImage(url, width = 400, height = 800)
3737
//监听回调结果
38-
iv.loadImage(url4, loadListener = object : OnImageListener {
39-
override fun onSuccess(drawable: Drawable?) {
38+
iv_9.loadImage(url4, requestListener = {
39+
onSuccess {
4040
Toast.makeText(application, R.string.load_success, Toast.LENGTH_LONG).show()
4141
}
42-
override fun onFail(msg: String?) {
43-
Toast.makeText(application, R.string.load_failed, Toast.LENGTH_LONG).show()
42+
onFail {
43+
Toast.makeText(application, R.string.load_failed, Toast.LENGTH_SHORT).show()
4444
}
4545
})
4646
//终极扩展 参数非常多必须使用可选参数方式调用
47+
iv_8.load(url1) {
48+
placeHolderResId = R.color.black
49+
transformation = arrayOf(GrayscaleTransformation())
50+
progressListener { isComplete, percentage, bytesRead, totalBytes ->
51+
//加载进度
52+
}
53+
requestListener {
54+
onSuccess {
55+
}
56+
onFail {
57+
}
58+
}
59+
}
60+
//超长扩展函数 选用建议用上面DSL方式
4761
iv_9.loadImage(load = R.drawable.test, with = MainActivity@ this,
4862
placeHolderResId = R.color.black,errorResId = R.color.blue,isAnim = false,
4963
requestListener = object : OnImageListener {
@@ -67,8 +81,9 @@ ImageView.loadBlurImage(...)
6781
ImageView.loadRoundCornerImage(...)
6882
ImageView.loadCircleImage(...)
6983
ImageView.loadBorderImage(...)
84+
ImageView.load(load: Any?, options: ImageOptions.() -> Unit)//DSL
7085

71-
//终极扩展函数
86+
//终极扩展函数 选用dsl方式
7287
@JvmOverloads
7388
fun ImageView.loadImage(load: Any?, with: Any? = this,
7489
//占位图 错误图
@@ -123,5 +138,10 @@ onProgressListener: OnProgressListener? = null, requestListener: OnImageListener
123138
app:cpv_progressTextVisible="false" />
124139
```
125140
## SelectImageView 仿微信图片点击响应
126-
一个点击可以变为半透明的View,算是一个Bonus,所以放在了Sample里。逻辑十分简单,看代码即可。
141+
一个点击可以变为半透明
142+
143+
## CircleImageView 圆形头像
144+
145+
一个圆形图片展示控件
146+
127147

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ android {
2929
dependencies {
3030
implementation fileTree(dir: 'libs', include: ['*.jar'])
3131
implementation 'androidx.appcompat:appcompat:1.0.0'
32+
implementation 'com.github.forJrking:KLuban:1.0.7'
3233
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
3334
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
3435
implementation project(path: ':libImage')

app/src/main/java/me/demo/sample/MainActivity.kt

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,14 @@ package me.demo.sample
22

33
import android.Manifest
44
import android.graphics.Color
5-
import android.graphics.drawable.Drawable
65
import android.os.Bundle
76
import android.util.Log
87
import androidx.appcompat.app.AppCompatActivity
98
import android.view.View
109
import android.widget.Toast
1110
import com.github.forjrking.image.*
1211
import com.github.forjrking.image.core.ImageOptions
13-
import com.github.forjrking.image.core.OnImageListener
1412
import com.github.forjrking.image.glide.GlideImageLoader
15-
import com.github.forjrking.image.glide.progress.OnProgressListener
1613
import com.github.forjrking.image.glide.transformation.CircleWithBorderTransformation
1714
import com.github.forjrking.image.glide.transformation.GrayscaleTransformation
1815
import kotlinx.android.synthetic.main.activity_main.*
@@ -48,8 +45,9 @@ class MainActivity : AppCompatActivity() {
4845
circleProgressView.visibility = View.VISIBLE
4946
iv_0.postDelayed(
5047
{
51-
iv_0.loadProgressImage(url3, placeHolder = R.color.gray, progressListener = object : OnProgressListener {
52-
override fun onProgress(isComplete: Boolean, percentage: Int, bytesRead: Long, totalBytes: Long) {
48+
iv_0.load(url3) {
49+
placeHolderResId = R.color.gray
50+
progressListener { isComplete, percentage, bytesRead, totalBytes ->
5351
// 跟踪进度
5452
Log.d("TAG", "onProgress: $percentage")
5553
if (isComplete) {
@@ -58,7 +56,7 @@ class MainActivity : AppCompatActivity() {
5856
circleProgressView.progress = percentage
5957
}
6058
}
61-
})
59+
}
6260

6361
}, 500
6462
)
@@ -67,22 +65,20 @@ class MainActivity : AppCompatActivity() {
6765
iv_8.setOnClickListener { }
6866
iv_1.loadImage(url1, placeHolder = R.color.blue)
6967
//
70-
iv_2.loadImage(url4, loadListener = object : OnImageListener {
71-
override fun onSuccess(drawable: Drawable?) {
68+
iv_2.loadImage(url4, requestListener = {
69+
onSuccess {
7270
Toast.makeText(application, R.string.load_success, Toast.LENGTH_LONG).show()
7371
}
74-
75-
override fun onFail(msg: String?) {
76-
Toast.makeText(application, R.string.load_failed, Toast.LENGTH_LONG).show()
72+
onFail {
73+
Toast.makeText(application, R.string.load_failed, Toast.LENGTH_SHORT).show()
7774
}
78-
7975
})
8076
//
8177
iv_4.loadCircleImage(url1)
8278
iv_5.loadBorderImage(url1, borderWidth = 10, borderColor = Color.RED)
8379
iv_6.loadGrayImage(url1)
8480
iv_7.loadRoundCornerImage(url1, radius = 40, type = ImageOptions.CornerType.ALL)
85-
iv_8.loadBlurImage(url4)
81+
// iv_8.loadBlurImage(url4)
8682
// iv_8.loadResizeImage(url2, width = 400, height = 800)
8783
//
8884
// iv_9.loadImage(load = R.drawable.test, with = MainActivity@ this, placeHolderResId = R.color.black,
@@ -100,6 +96,21 @@ class MainActivity : AppCompatActivity() {
10096
//
10197
// }, transformation = *arrayOf(GrayscaleTransformation(), CircleWithBorderTransformation(borderWidth = 0, borderColor = 0)))
10298
// iv_10.loadImage(url2, placeHolder = R.color.green)
99+
iv_8.load(url1) {
100+
placeHolderResId = R.color.black
101+
transformation = arrayOf(GrayscaleTransformation(), CircleWithBorderTransformation(borderWidth = 0, borderColor = 0))
102+
progressListener { isComplete, percentage, bytesRead, totalBytes ->
103+
//加载进度
104+
}
105+
requestListener {
106+
onSuccess {
107+
108+
}
109+
onFail {
110+
111+
}
112+
}
113+
}
103114
}
104115

105116
private fun hasStoragePermission(): Boolean {
@@ -129,4 +140,5 @@ class MainActivity : AppCompatActivity() {
129140
companion object {
130141
private const val WRITE_EXTERNAL_PERM = 123
131142
}
143+
132144
}

app/src/main/res/layout/activity_main.xml

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@
5252
android:layout_marginBottom="15dp"
5353
android:scaleType="centerCrop" />
5454

55-
<!-- <ImageView-->
56-
<!-- android:id="@+id/iv_3"-->
57-
<!-- android:layout_width="match_parent"-->
58-
<!-- android:layout_height="200dp"-->
59-
<!-- android:layout_marginBottom="15dp"-->
60-
<!-- android:scaleType="centerCrop" />-->
55+
<!-- <ImageView-->
56+
<!-- android:id="@+id/iv_3"-->
57+
<!-- android:layout_width="match_parent"-->
58+
<!-- android:layout_height="200dp"-->
59+
<!-- android:layout_marginBottom="15dp"-->
60+
<!-- android:scaleType="centerCrop" />-->
6161

6262

6363
<ImageView
@@ -83,27 +83,26 @@
8383
android:id="@+id/iv_7"
8484
android:layout_width="match_parent"
8585
android:layout_height="200dp"
86-
android:padding="15dp"
87-
android:layout_marginBottom="15dp" />
86+
android:layout_marginBottom="15dp"
87+
android:padding="15dp" />
8888

8989
<me.demo.sample.SelectImageView
9090
android:id="@+id/iv_8"
9191
android:layout_width="match_parent"
9292
android:layout_height="200dp"
93-
android:scaleType="centerCrop"
9493
android:layout_marginBottom="15dp" />
9594

96-
<!-- <me.demo.sample.SelectImageView-->
97-
<!-- android:id="@+id/iv_9"-->
98-
<!-- android:layout_width="match_parent"-->
99-
<!-- android:layout_height="200dp"-->
100-
<!-- android:layout_marginBottom="15dp" />-->
101-
102-
<!-- <ImageView-->
103-
<!-- android:id="@+id/iv_10"-->
104-
<!-- android:layout_width="match_parent"-->
105-
<!-- android:layout_height="200dp"-->
106-
<!-- android:layout_marginBottom="15dp" />-->
95+
<!-- <me.demo.sample.SelectImageView-->
96+
<!-- android:id="@+id/iv_9"-->
97+
<!-- android:layout_width="match_parent"-->
98+
<!-- android:layout_height="200dp"-->
99+
<!-- android:layout_marginBottom="15dp" />-->
100+
101+
<!-- <ImageView-->
102+
<!-- android:id="@+id/iv_10"-->
103+
<!-- android:layout_width="match_parent"-->
104+
<!-- android:layout_height="200dp"-->
105+
<!-- android:layout_marginBottom="15dp" />-->
107106

108107
</LinearLayout>
109108

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ buildscript {
66
repositories {
77
jcenter()
88
google()
9+
maven { url 'https://jitpack.io' }
910
}
1011
dependencies {
1112
classpath 'com.android.tools.build:gradle:4.0.2'

img/img.gif

701 KB
Loading

libImage/src/main/java/com/github/forjrking/image/ImageExt.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ fun ImageView.loadImage(@RawRes @DrawableRes drawableId: Int, @RawRes @DrawableR
2929
}
3030

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

3737
@JvmOverloads
@@ -107,8 +107,8 @@ fun ImageView.loadImage(load: Any?, with: Any? = this,
107107
//自定义转换器
108108
vararg transformation: Transformation<Bitmap>,
109109
//进度监听,请求回调监听
110-
onProgressListener: OnProgressListener? = null, requestListener: OnImageListener? = null) {
111-
GlideImageLoader.loadImage(ImageOptions().also {
110+
onProgressListener: OnProgressListener = null, requestListener: (OnImageListener.() -> Unit)? = null) {
111+
val options = ImageOptions().also {
112112
it.res = load
113113
it.imageView = this
114114
it.context = with
@@ -140,7 +140,19 @@ fun ImageView.loadImage(load: Any?, with: Any? = this,
140140
it.roundRadius = roundRadius
141141
it.cornerType = cornerType
142142
it.transformation = transformation
143-
it.onProgressListener = onProgressListener
144-
it.requestListener = requestListener
145-
})
143+
it.progressListener(onProgressListener)
144+
requestListener?.let { l -> it.requestListener(l) }
145+
}
146+
GlideImageLoader.loadImage(options)
147+
}
148+
149+
/**模仿 coil**/
150+
fun ImageView.load(load: Any?, options: (ImageOptions.() -> Unit)? = null) {
151+
val imageOptions = ImageOptions().also {
152+
it.res = load
153+
it.imageView = this
154+
}
155+
GlideImageLoader.loadImage(options?.let {
156+
imageOptions.also(options)
157+
} ?: imageOptions)
146158
}

libImage/src/main/java/com/github/forjrking/image/core/ImageOptions.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import android.widget.ImageView
77
import androidx.annotation.ColorInt
88
import androidx.annotation.DrawableRes
99
import com.bumptech.glide.load.Transformation
10-
import com.bumptech.glide.load.engine.cache.DiskCache
1110
import com.github.forjrking.image.glide.progress.OnProgressListener
1211

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

136135
/*** 网络进度监听器*/
137-
var onProgressListener: OnProgressListener? = null
136+
var onProgressListener: OnProgressListener = null
137+
private set
138+
139+
fun progressListener(listener: OnProgressListener) {
140+
this.onProgressListener = listener
141+
}
138142

139143
/*** 加载监听*/
140144
var requestListener: OnImageListener? = null
145+
private set
146+
147+
fun requestListener(listener: OnImageListener.() -> Unit) {
148+
requestListener = OnImageListener().also(listener)
149+
}
141150

142151
/**
143152
* 指定加载图片的大小

libImage/src/main/java/com/github/forjrking/image/core/OnImageListener.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@ package com.github.forjrking.image.core
22

33
import android.graphics.drawable.Drawable
44

5-
interface OnImageListener {
5+
class OnImageListener {
6+
internal var onFailAction: ((String?) -> Unit)? = null
7+
internal var onSuccessAction: ((Drawable?) -> Unit)? = null
68

7-
fun onSuccess(drawable: Drawable?)
9+
fun onFail(action: (String?) -> Unit) {
10+
onFailAction = action
11+
}
812

9-
fun onFail(msg: String?)
13+
fun onSuccess(action: (Drawable?) -> Unit) {
14+
onSuccessAction = action
15+
}
1016
}

libImage/src/main/java/com/github/forjrking/image/glide/GlideImageLoader.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,12 @@ object GlideImageLoader {
181181
options.requestListener?.let {
182182
addListener(object : RequestListener<Drawable> {
183183
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
184-
options.requestListener?.onFail(e.toString())
184+
options.requestListener?.onFailAction?.invoke(e.toString())
185185
return false
186186
}
187187

188188
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
189-
options.requestListener?.onSuccess(resource)
189+
options.requestListener?.onSuccessAction?.invoke(resource)
190190
return false
191191
}
192192
})

0 commit comments

Comments
 (0)