-
-
Notifications
You must be signed in to change notification settings - Fork 302
/
GlideTransformUtils.kt
123 lines (113 loc) · 3.89 KB
/
GlideTransformUtils.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package ktx.dev.other
import android.graphics.*
import android.os.Build
import androidx.annotation.RequiresApi
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import com.bumptech.glide.load.resource.bitmap.TransformationUtils
import dev.utils.app.image.ImageFilterUtils
import java.security.MessageDigest
import kotlin.math.min
/**
* detail: Glide 图形处理工具类
* @author Ttt
* 结合 Glide 实现很炫的图片效果框架
* @see https://github.com/open-android/Glide-transformations
* @see https://github.com/wasabeef/glide-transformations
*/
class GlideTransformUtils private constructor() {
/**
* detail: 旋转处理
* @author Ttt
*/
class RotateTransformation(
// 旋转角度
private val rotateRotationAngle: Float
) : BitmapTransformation() {
override fun transform(
pool: BitmapPool,
toTransform: Bitmap,
outWidth: Int,
outHeight: Int
): Bitmap {
val matrix = Matrix()
matrix.postRotate(rotateRotationAngle)
return Bitmap.createBitmap(
toTransform, 0, 0,
toTransform.width, toTransform.height, matrix, true
)
}
override fun updateDiskCacheKey(messageDigest: MessageDigest) {}
}
/**
* detail: 转换圆形处理
* @author Ttt
*/
class GlideCircleTransform : BitmapTransformation() {
override fun transform(
pool: BitmapPool,
toTransform: Bitmap,
outWidth: Int,
outHeight: Int
): Bitmap {
val size = min(toTransform.width, toTransform.height)
val x = (toTransform.width - size) / 2
val y = (toTransform.height - size) / 2
val squared = Bitmap.createBitmap(toTransform, x, y, size, size)
val result: Bitmap = pool[size, size, Bitmap.Config.ARGB_4444]
val canvas = Canvas(result)
val paint = Paint()
paint.shader = BitmapShader(squared, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
paint.isAntiAlias = true
val r = size / 2F
canvas.drawCircle(r, r, r, paint)
return result
}
override fun updateDiskCacheKey(messageDigest: MessageDigest) {}
}
/**
* detail: 圆角处理
* @author Ttt
*/
class GlideRoundTransform(
// 圆角大小
private val radius: Float
) : BitmapTransformation() {
override fun transform(
pool: BitmapPool,
toTransform: Bitmap,
outWidth: Int,
outHeight: Int
): Bitmap {
val result = pool[toTransform.width, toTransform.height, Bitmap.Config.ARGB_4444]
val canvas = Canvas(result)
val paint = Paint()
paint.shader = BitmapShader(toTransform, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
paint.isAntiAlias = true
val rectF = RectF(
0F, 0F, toTransform.width.toFloat(),
toTransform.height.toFloat()
)
canvas.drawRoundRect(rectF, radius, radius, paint)
return result
}
override fun updateDiskCacheKey(messageDigest: MessageDigest) {}
}
/**
* detail: 图片模糊处理
* @author Ttt
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
class GlideBlurformation : BitmapTransformation() {
override fun transform(
pool: BitmapPool,
toTransform: Bitmap,
outWidth: Int,
outHeight: Int
): Bitmap {
val bitmap = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight)
return ImageFilterUtils.blur(bitmap, 20)
}
override fun updateDiskCacheKey(messageDigest: MessageDigest) {}
}
}