Skip to content

Commit 8d74f34

Browse files
committed
add TBlurView.
1 parent e2bf4a5 commit 8d74f34

File tree

6 files changed

+138
-62
lines changed

6 files changed

+138
-62
lines changed

RxDemo/src/main/java/com/tamsiree/rxdemo/activity/ActivityTCardGallery.kt

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package com.tamsiree.rxdemo.activity
22

3-
import android.graphics.BitmapFactory
43
import android.os.Bundle
54
import androidx.recyclerview.widget.LinearLayoutManager
65
import com.tamsiree.rxdemo.R
76
import com.tamsiree.rxdemo.adapter.AdapterCardGallery
8-
import com.tamsiree.rxkit.RxAnimationTool
9-
import com.tamsiree.rxkit.TBlurTool
107
import com.tamsiree.rxkit.interfaces.OnDoIntListener
118
import com.tamsiree.rxkit.view.RxToast
129
import com.tamsiree.rxui.activity.ActivityBase
@@ -53,13 +50,9 @@ class ActivityTCardGallery : ActivityBase() {
5350
RxToast.normal("选中$intValue")
5451
if (mLastPos == intValue) {
5552
return
56-
} else if (mLastPos > intValue) {
57-
// tIndicator.moveToLeft()
58-
} else if (mLastPos < intValue) {
59-
// tIndicator.moveToRight()
6053
}
6154
mLastPos = intValue
62-
notifyBackgroundChange()
55+
blurView.notifyChange(mList[mLastPos])
6356
}
6457
})
6558
}
@@ -72,14 +65,4 @@ class ActivityTCardGallery : ActivityBase() {
7265
recyclerView.adapter?.notifyDataSetChanged()
7366
}
7467

75-
private fun notifyBackgroundChange() {
76-
val resId = mList[mLastPos]
77-
blurView?.removeCallbacks(mBlurRunnable)
78-
mBlurRunnable = Runnable {
79-
val bitmap = BitmapFactory.decodeResource(resources, resId)
80-
RxAnimationTool.startSwitchBackgroundAnim(blurView, TBlurTool.getBlurBitmap(blurView?.context, bitmap, 15))
81-
}
82-
blurView?.postDelayed(mBlurRunnable, 300)
83-
}
84-
8568
}

RxDemo/src/main/res/layout/activity_tcard_grallery.xml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@
2020
android:orientation="vertical"
2121
tools:context=".activity.ActivityTCardGallery">
2222

23-
<ImageView
23+
<com.tamsiree.rxui.view.TBlurView
2424
android:id="@+id/blurView"
2525
android:layout_width="match_parent"
2626
android:layout_height="match_parent"
27-
android:background="#3f000000"
28-
android:scaleType="centerCrop" />
27+
app:blurDelayTime="100"
28+
app:blurRadius="15"
29+
app:blurSrc="@drawable/bg_friend" />
2930

3031
<com.tamsiree.rxui.view.tcardgralleryview.TCardGalleryView
3132
android:id="@+id/recyclerView"
@@ -53,11 +54,11 @@
5354
android:layout_height="wrap_content"
5455
android:visibility="visible"
5556
app:dotColor="@color/colorPrimaryDark"
56-
app:selectedDotColor="@color/colorPrimary"
57-
tools:background="@color/colorPrimary" />
57+
app:selectedDotColor="@color/colorPrimary" />
5858

5959
</LinearLayout>
6060

61+
6162
</RelativeLayout>
6263

6364
</LinearLayout>

RxKit/src/main/java/com/tamsiree/rxkit/RxAnimationTool.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,14 +272,14 @@ object RxAnimationTool {
272272
oldBitmapDrawable = ColorDrawable(-0x3d3d3e)
273273
}
274274
if (oldTransitionDrawable == null) {
275-
oldTransitionDrawable = TransitionDrawable(arrayOf(oldBitmapDrawable, BitmapDrawable(bitmap)))
275+
oldTransitionDrawable = TransitionDrawable(arrayOf(oldBitmapDrawable, BitmapDrawable(RxTool.getContext().resources, bitmap)))
276276
oldTransitionDrawable.setId(0, 0)
277277
oldTransitionDrawable.setId(1, 1)
278278
oldTransitionDrawable.isCrossFadeEnabled = true
279279
view.setImageDrawable(oldTransitionDrawable)
280280
} else {
281281
oldTransitionDrawable.setDrawableByLayerId(oldTransitionDrawable.getId(0), oldBitmapDrawable)
282-
oldTransitionDrawable.setDrawableByLayerId(oldTransitionDrawable.getId(1), BitmapDrawable(bitmap))
282+
oldTransitionDrawable.setDrawableByLayerId(oldTransitionDrawable.getId(1), BitmapDrawable(RxTool.getContext().resources, bitmap))
283283
}
284284
oldTransitionDrawable.startTransition(1000)
285285
}

RxKit/src/main/java/com/tamsiree/rxkit/TBlurTool.kt

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import android.renderscript.RenderScript.RSMessageHandler
1111
import android.renderscript.ScriptIntrinsicBlur
1212
import android.widget.ImageView
1313
import com.tamsiree.rxkit.RxImageTool.isEmptyBitmap
14+
import kotlin.math.abs
15+
import kotlin.math.max
16+
import kotlin.math.min
1417

1518
/**
1619
* RenderScript图片高斯模糊
@@ -20,34 +23,33 @@ object TBlurTool {
2023
/**
2124
* 建议模糊度(在0.0到25.0之间)
2225
*/
23-
private const val BLUR_RADIUS = 20
26+
private const val BLUR_RADIUS = 20f
2427
private const val SCALED_WIDTH = 100
2528
private const val SCALED_HEIGHT = 100
2629

2730
@JvmOverloads
2831
@JvmStatic
29-
fun blur(imageView: ImageView, bitmap: Bitmap?, radius: Int = BLUR_RADIUS) {
32+
fun blur(imageView: ImageView, bitmap: Bitmap, radius: Float = BLUR_RADIUS) {
3033
imageView.setImageBitmap(getBlurBitmap(imageView.context, bitmap, radius))
3134
}
3235

3336
@JvmStatic
34-
fun getBlurBitmap(context: Context?, bitmap: Bitmap?): Bitmap {
37+
fun getBlurBitmap(context: Context, bitmap: Bitmap): Bitmap {
3538
return getBlurBitmap(context, bitmap, BLUR_RADIUS)
3639
}
3740

3841
/**
3942
* 得到模糊后的bitmap
40-
* thanks http://wl9739.github.io/2016/07/14/教你一分钟实现模糊效果/
4143
*
4244
* @param context
4345
* @param bitmap
4446
* @param radius
4547
* @return
4648
*/
4749
@JvmStatic
48-
fun getBlurBitmap(context: Context?, bitmap: Bitmap?, radius: Int): Bitmap {
50+
fun getBlurBitmap(context: Context, bitmap: Bitmap, radius: Float): Bitmap {
4951
// 将缩小后的图片做为预渲染的图片。
50-
val inputBitmap = Bitmap.createScaledBitmap(bitmap!!, SCALED_WIDTH, SCALED_HEIGHT, false)
52+
val inputBitmap = Bitmap.createScaledBitmap(bitmap, SCALED_WIDTH, SCALED_HEIGHT, false)
5153
// 创建一张渲染后的输出图片。
5254
val outputBitmap = Bitmap.createBitmap(inputBitmap)
5355

@@ -62,7 +64,7 @@ object TBlurTool {
6264
val tmpOut = Allocation.createFromBitmap(rs, outputBitmap)
6365

6466
// 设置渲染的模糊程度, 25f是最大模糊度
65-
blurScript.setRadius(radius.toFloat())
67+
blurScript.setRadius(radius)
6668
// 设置blurScript对象的输入内存
6769
blurScript.setInput(tmpIn)
6870
// 将输出数据保存到输出内存中
@@ -72,17 +74,7 @@ object TBlurTool {
7274
tmpOut.copyTo(outputBitmap)
7375
return outputBitmap
7476
}
75-
/**
76-
* 快速模糊
77-
*
78-
* 先缩小原图,对小图进行模糊,再放大回原先尺寸
79-
*
80-
* @param src 源图片
81-
* @param scale 缩小倍数(0...1)
82-
* @param radius 模糊半径
83-
* @param recycle 是否回收
84-
* @return 模糊后的图片
85-
*/
77+
8678
/**
8779
* 快速模糊
8880
*
@@ -139,8 +131,8 @@ object TBlurTool {
139131
*/
140132
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
141133
@JvmStatic
142-
fun renderScriptBlur(src: Bitmap?, radius: Float): Bitmap? {
143-
var radius = radius
134+
fun renderScriptBlur(src: Bitmap, radius: Float): Bitmap? {
135+
var mRadius = radius
144136
if (isEmptyBitmap(src)) return null
145137
var rs: RenderScript? = null
146138
try {
@@ -149,13 +141,13 @@ object TBlurTool {
149141
val input = Allocation.createFromBitmap(rs, src, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT)
150142
val output = Allocation.createTyped(rs, input.type)
151143
val blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))
152-
if (radius > 25) {
153-
radius = 25.0f
154-
} else if (radius <= 0) {
155-
radius = 1.0f
144+
if (mRadius > 25) {
145+
mRadius = 25.0f
146+
} else if (mRadius <= 0) {
147+
mRadius = 1.0f
156148
}
157149
blurScript.setInput(input)
158-
blurScript.setRadius(radius)
150+
blurScript.setRadius(mRadius)
159151
blurScript.forEach(output)
160152
output.copyTo(src)
161153
} finally {
@@ -173,17 +165,16 @@ object TBlurTool {
173165
* @return stackBlur模糊图片
174166
*/
175167
@JvmStatic
176-
fun stackBlur(src: Bitmap?, radius: Int, recycle: Boolean): Bitmap? {
177-
val ret: Bitmap?
178-
ret = if (recycle) {
168+
fun stackBlur(src: Bitmap, radius: Int, recycle: Boolean): Bitmap? {
169+
val ret: Bitmap = if (recycle) {
179170
src
180171
} else {
181-
src!!.copy(src.config, true)
172+
src.copy(src.config, true)
182173
}
183174
if (radius < 1) {
184175
return null
185176
}
186-
val w = ret!!.width
177+
val w = ret.width
187178
val h = ret.height
188179
val pix = IntArray(w * h)
189180
ret.getPixels(pix, 0, w, 0, 0, w, h)
@@ -204,7 +195,7 @@ object TBlurTool {
204195
var yp: Int
205196
var yi: Int
206197
var yw: Int
207-
val vmin = IntArray(Math.max(w, h))
198+
val vmin = IntArray(max(w, h))
208199
var divsum = div + 1 shr 1
209200
divsum *= divsum
210201
val dv = IntArray(256 * divsum)
@@ -240,12 +231,12 @@ object TBlurTool {
240231
rinsum = ginsum
241232
i = -radius
242233
while (i <= radius) {
243-
p = pix[yi + Math.min(wm, Math.max(i, 0))]
234+
p = pix[yi + min(wm, max(i, 0))]
244235
sir = stack[i + radius]
245236
sir[0] = p and 0xff0000 shr 16
246237
sir[1] = p and 0x00ff00 shr 8
247238
sir[2] = p and 0x0000ff
248-
rbs = r1 - Math.abs(i)
239+
rbs = r1 - abs(i)
249240
rsum += sir[0] * rbs
250241
gsum += sir[1] * rbs
251242
bsum += sir[2] * rbs
@@ -275,7 +266,7 @@ object TBlurTool {
275266
goutsum -= sir[1]
276267
boutsum -= sir[2]
277268
if (y == 0) {
278-
vmin[x] = Math.min(x + radius + 1, wm)
269+
vmin[x] = min(x + radius + 1, wm)
279270
}
280271
p = pix[yw + vmin[x]]
281272
sir[0] = p and 0xff0000 shr 16
@@ -315,12 +306,12 @@ object TBlurTool {
315306
yp = -radius * w
316307
i = -radius
317308
while (i <= radius) {
318-
yi = Math.max(0, yp) + x
309+
yi = max(0, yp) + x
319310
sir = stack[i + radius]
320311
sir[0] = r[yi]
321312
sir[1] = g[yi]
322313
sir[2] = b[yi]
323-
rbs = r1 - Math.abs(i)
314+
rbs = r1 - abs(i)
324315
rsum += r[yi] * rbs
325316
gsum += g[yi] * rbs
326317
bsum += b[yi] * rbs
@@ -354,7 +345,7 @@ object TBlurTool {
354345
goutsum -= sir[1]
355346
boutsum -= sir[2]
356347
if (x == 0) {
357-
vmin[y] = Math.min(y + r1, hm) * w
348+
vmin[y] = min(y + r1, hm) * w
358349
}
359350
p = x + vmin[y]
360351
sir[0] = r[p]
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.tamsiree.rxui.view
2+
3+
import android.annotation.SuppressLint
4+
import android.content.Context
5+
import android.graphics.Bitmap
6+
import android.graphics.BitmapFactory
7+
import android.util.AttributeSet
8+
import android.widget.ImageView
9+
import androidx.annotation.IntRange
10+
import androidx.appcompat.widget.AppCompatImageView
11+
import com.tamsiree.rxkit.RxAnimationTool.startSwitchBackgroundAnim
12+
import com.tamsiree.rxkit.TBlurTool
13+
import com.tamsiree.rxkit.TBlurTool.getBlurBitmap
14+
import com.tamsiree.rxui.R
15+
16+
/**
17+
* @ClassName TBlurImageView
18+
* @Description TODO
19+
* @Author tamsiree
20+
* @Date 20-3-26 下午2:32
21+
* @Version 1.0
22+
*/
23+
class TBlurView : AppCompatImageView {
24+
private lateinit var mImageView: ImageView
25+
private var mBlurRunnable: Runnable? = null
26+
27+
/**
28+
* 模糊度 (0...25f)
29+
*/
30+
@SuppressLint("SupportAnnotationUsage")
31+
@IntRange(from = 0, to = 25)
32+
var blurRadius = 15f
33+
34+
//模糊View引用的资源ID
35+
var blurSrc = 0
36+
37+
/**
38+
* 单位是 ms 毫秒
39+
*/
40+
var delayTime: Long = 200
41+
private lateinit var mContext: Context
42+
43+
constructor(context: Context) : super(context) {
44+
initView(context, null)
45+
}
46+
47+
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
48+
initView(context, attrs)
49+
}
50+
51+
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
52+
initView(context, attrs)
53+
}
54+
55+
private fun initView(context: Context, attrs: AttributeSet?) {
56+
mContext = context
57+
mImageView = this
58+
mImageView.scaleType = ScaleType.CENTER_CROP
59+
//获得这个控件对应的属性。
60+
val a = context.obtainStyledAttributes(attrs, R.styleable.TBlurView)
61+
try {
62+
//模糊View
63+
blurSrc = a.getResourceId(R.styleable.TBlurView_blurSrc, R.drawable.icon_placeholder)
64+
blurRadius = a.getInteger(R.styleable.TBlurView_blurRadius, 15).toFloat()
65+
delayTime = a.getInteger(R.styleable.TBlurView_blurDelayTime, 200).toLong()
66+
} finally {
67+
//回收这个对象
68+
a.recycle()
69+
}
70+
if (isInEditMode) {
71+
val bitmap = BitmapFactory.decodeResource(mContext.resources, blurSrc)
72+
mImageView.setImageBitmap(TBlurTool.stackBlur(bitmap, blurRadius.toInt(), true))
73+
} else {
74+
notifyChange(blurSrc)
75+
}
76+
}
77+
78+
fun notifyChange(resId: Int) {
79+
blurSrc = resId
80+
removeCallbacks(mBlurRunnable)
81+
mBlurRunnable = Runnable { setBlurImage() }
82+
postDelayed(mBlurRunnable, delayTime)
83+
}
84+
85+
private fun generateBlurImage(): Bitmap {
86+
val bitmap = BitmapFactory.decodeResource(mContext.resources, blurSrc)
87+
return getBlurBitmap(mContext, bitmap, blurRadius)
88+
}
89+
90+
private fun setBlurImage() {
91+
startSwitchBackgroundAnim(mImageView, generateBlurImage())
92+
}
93+
94+
}

RxUI/src/main/res/values/attrs.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,4 +636,11 @@
636636
<attr name="TLoadingColor" format="color" />
637637
</declare-styleable>
638638

639+
<declare-styleable name="TBlurView">
640+
<attr name="blurSrc" format="reference" />
641+
<!-- 设置显示器动画时间-->
642+
<attr name="blurDelayTime" format="integer" />
643+
<attr name="blurRadius" format="integer" />
644+
</declare-styleable>
645+
639646
</resources>

0 commit comments

Comments
 (0)