Android 毛玻璃 高斯模糊 五种方法,赶紧用

需求:

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-transformationsicon-default.png?t=O83Ahttps://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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&岁月不待人&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值