需求:
Android实现模糊真的很烦,每次UI画出来就觉得真的很烦。一般不会做,每次做就觉得有点烦,有时候是模糊图片,有时候是模糊有个背景。因为遇到模糊的需求的时候比较少,所以也没总结。这次遇到了,还让我走了好些绕路。这次进行个小小总结。
总结了用到的五种实现方式。
实现方式一:BlurView实现背景模糊
1.添加依赖
在app的build.gradle下添加依赖
implementation 'com.github.Dimezis:BlurView:version-2.0.6'
如果拉不下来,换下网,还有就是项目的build.gradle下配置
maven { url 'https://jitpack.io' }
google()
mavenCentral()
应该就可以拉下来了
2.xml配置
<com.eightbitlab.blurview.BlurView
android:id="@+id/blurView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:blurOverlayColor="#80000000"
/>
3.activity里的代码
import android.graphics.drawable.Drawable
import androidx.core.content.ContextCompat
import com.eightbitlab.blurview.BlurView
import com.eightbitlab.blurview.RenderScriptBlur
class YourActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.your_layout)
val blurView = findViewById<BlurView>(R.id.blurView)
setupBlurView(blurView)
}
private fun setupBlurView(blurView: BlurView) {
val rootView = window.decorView.findViewById<ViewGroup>(android.R.id.content)
// 模糊背景的绘制窗口
val windowBackground: Drawable = window.decorView.background
blurView.setupWith(rootView)
.setFrameClearDrawable(windowBackground) // 设置窗口背景
.setBlurAlgorithm(RenderScriptBlur(this)) // 使用 RenderScriptBlur 实现模糊
.setBlurRadius(10f) // 设置模糊半径
.setHasFixedTransformationMatrix(true) // 提高性能,适用于静态模糊
}
}
4.实现效果
4.1 红框里是我加的模糊,默认现在还看不出来,可以看到,他的模糊并不会影响在他布局之上的空间
4.2 当界面向上滑动后
这样就很舒服。实现了模糊效果。
实现方式二:图片模糊AndroidUtilCode
使用Blankj的AndroidUtilCode里的 ImageUtils.java的fastBlur方法
需求:viewpager2实现画廊,在每个viewpager的图片后,放一个全屏的画廊图片。
2.1传入url地址,网络请求返回bitmap对象
suspend fun getBitmapFromUrlAsync(urlString: String): Bitmap? = withContext(Dispatchers.IO) {
var bitmap: Bitmap? = null
var connection: HttpURLConnection? = null
try {
val url = URL(urlString)
connection = url.openConnection() as HttpURLConnection
connection.doInput = true
connection.connectTimeout = 6000
connection.readTimeout = 6000
connection.connect()
val inputStream = connection.inputStream
val options = BitmapFactory.Options().apply { inSampleSize = 4 }
bitmap = BitmapFactory.decodeStream(inputStream, null, options)
} catch (e: Exception) {
e.printStackTrace()
} finally {
connection?.disconnect()
}
bitmap
}
inSampleSize=4,将获取到的图片宽高直接变成1/4,内存占用变成原来的1/16,反正都要模糊,就别浪费内存了。较少消耗
2.2 Glide加载图片
lifecycleScope.launch {
curData?.coverImage?.let {
Glide.with(this@StayAc)
.load(ImageUtils.fastBlur(getBitmapFromUrlAsync(it), 0.5f, 10f)).into(binding.stayBlurBg)
}
}
2.3 展示效果
实现方式三:glide-transformations实现图片模糊
使用Glide搭配glide-transformations实现
原理:
RenderScript
模糊
RenderScript
是 Android 提供的一种高性能图像处理框架。glide-transformations
的模糊实现使用了RenderScript
,可以在 API 17+ 的设备上运行。
添加依赖
implementation 'com.github.wasabeef:glide-transformations:4.3.0'
实现代码
Glide.with(this@StayAc)
.load(it)
.transform(BlurTransformation(40)) // 模糊半径为40
.into(binding.stayBlurBg)
这个依赖库挺牛批的
https://github.com/wasabeef/glide-transformationshttps://github.com/wasabeef/glide-transformations
实现方式四: RenderEffect 图片模糊
RenderEffect这玩意儿只支持android 12及以上,性能比RenderScript好
Glide.with(this@StayAc)
.load(it)
.into(binding.stayBlurBg)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val blurEffect =
RenderEffect.createBlurEffect(10f, 10f, Shader.TileMode.CLAMP)
binding.stayBlurBg.setRenderEffect(blurEffect)
}
实现方式五:Blurry三方库
很老的库了,而且很久很久没更新了,提供了三种方法,但是试下来有两个无效
//不行
Blurry.with(context)
.radius(10)//模糊半径
.sampling(8)//缩放大小,先缩小再放大
.color(Color.argb(66, 255, 255, 0))//颜色
.async()//是否异步
.animate(500)//显示动画,目前仅支持淡入淡出,默认时间是300毫秒,仅支持传入控件为ViewGroup
.onto(viewGroup);
//不行
Blurry.with(context)
.radius(10)//模糊半径
.sampling(8)//缩放大小,先缩小再放大
.color(Color.argb(66, 255, 255, 0))//颜色
.async()//是否异步
.capture(view)//传入View
.into(view);//显示View
//for bitmap 有效
Blurry.with(context)
.radius(10)//模糊半径
.sampling(8)//缩放大小,先缩小再放大
.color(Color.argb(66, 255, 255, 0))//颜色
.async()//是否异步
.from(bitmap)//传入bitmap
.into(view);//显示View