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

打印 上一主题 下一主题

主题 949|帖子 949|积分 2847

需求:
Android实现含糊真的很烦,每次UI画出来就以为真的很烦。一样平常不会做,每次做就以为有点烦,偶然候是含糊图片,偶然候是含糊有个配景。由于遇到含糊的需求的时间比力少,所以也没总结。这次遇到了,还让我走了好些绕路。这次进行个小小总结。
总结了用到的五种实现方式。
实现方式一:BlurView实现配景含糊

1.添加依靠
在app的build.gradle下添加依靠
  1. implementation 'com.github.Dimezis:BlurView:version-2.0.6'
复制代码
假如拉不下来,换下网,另有就是项目的build.gradle下设置
  1. maven { url 'https://jitpack.io' }
  2. google()
  3. mavenCentral()
复制代码
应该就可以拉下来了
2.xml设置
  1. <com.eightbitlab.blurview.BlurView
  2.     android:id="@+id/blurView"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:layout_gravity="center"
  6.     app:blurOverlayColor="#80000000"
  7. />
复制代码
3.activity里的代码
  1. import android.graphics.drawable.Drawable
  2. import androidx.core.content.ContextCompat
  3. import com.eightbitlab.blurview.BlurView
  4. import com.eightbitlab.blurview.RenderScriptBlur
  5. class YourActivity : AppCompatActivity() {
  6.     override fun onCreate(savedInstanceState: Bundle?) {
  7.         super.onCreate(savedInstanceState)
  8.         setContentView(R.layout.your_layout)
  9.         val blurView = findViewById<BlurView>(R.id.blurView)
  10.         setupBlurView(blurView)
  11.     }
  12.     private fun setupBlurView(blurView: BlurView) {
  13.         val rootView = window.decorView.findViewById<ViewGroup>(android.R.id.content)
  14.         // 模糊背景的绘制窗口
  15.         val windowBackground: Drawable = window.decorView.background
  16.         blurView.setupWith(rootView)
  17.             .setFrameClearDrawable(windowBackground)  // 设置窗口背景
  18.             .setBlurAlgorithm(RenderScriptBlur(this)) // 使用 RenderScriptBlur 实现模糊
  19.             .setBlurRadius(10f)                       // 设置模糊半径
  20.             .setHasFixedTransformationMatrix(true)    // 提高性能,适用于静态模糊
  21.     }
  22. }
复制代码
4.实现效果
4.1 红框里是我加的含糊,默认现在还看不出来,可以看到,他的含糊并不会影响在他结构之上的空间

4.2 当界面向上滑动后 

这样就很舒服。实现了含糊效果。
实现方式二:图片含糊AndroidUtilCode

利用Blankj的AndroidUtilCode里的 ImageUtils.java的fastBlur方法
需求:viewpager2实现画廊,在每个viewpager的图片后,放一个全屏的画廊图片。
2.1传入url地址,网络请求返回bitmap对象
  1. suspend fun getBitmapFromUrlAsync(urlString: String): Bitmap? = withContext(Dispatchers.IO) {
  2.         var bitmap: Bitmap? = null
  3.         var connection: HttpURLConnection? = null
  4.         try {
  5.             val url = URL(urlString)
  6.             connection = url.openConnection() as HttpURLConnection
  7.             connection.doInput = true
  8.             connection.connectTimeout = 6000
  9.             connection.readTimeout = 6000
  10.             connection.connect()
  11.             val inputStream = connection.inputStream
  12.             val options = BitmapFactory.Options().apply { inSampleSize = 4 }
  13.             bitmap = BitmapFactory.decodeStream(inputStream, null, options)
  14.         } catch (e: Exception) {
  15.             e.printStackTrace()
  16.         } finally {
  17.             connection?.disconnect()
  18.         }
  19.         bitmap
  20.     }
复制代码
inSampleSize=4,将获取到的图片宽高直接变成1/4,内存占用变成原来的1/16,反正都要含糊,就别浪费内存了。较少斲丧 
2.2 Glide加载图片
  1. lifecycleScope.launch {
  2.             curData?.coverImage?.let {
  3.                  Glide.with(this@StayAc)
  4.                     .load(ImageUtils.fastBlur(getBitmapFromUrlAsync(it), 0.5f, 10f)).into(binding.stayBlurBg)
  5.               }
  6.          }
复制代码
2.3 展示效果 

实现方式三:glide-transformations实现图片含糊

利用Glide搭配glide-transformations实现
原理:
RenderScript 含糊


  • RenderScript 是 Android 提供的一种高性能图像处理框架。
  • glide-transformations 的含糊实现利用了 RenderScript,可以在 API 17+ 的设备上运行。
添加依靠
  1.     implementation 'com.github.wasabeef:glide-transformations:4.3.0'
复制代码
实今世码
  1.   Glide.with(this@StayAc)
  2. .load(it)
  3. .transform(BlurTransformation(40)) // 模糊半径为40
  4. .into(binding.stayBlurBg)
复制代码
这个依靠库挺牛批的 
https://github.com/wasabeef/glide-transformations
https://github.com/wasabeef/glide-transformations
实现方式四: RenderEffect 图片含糊

RenderEffect这玩意儿只支持android 12及以上,性能比RenderScript好
  1. Glide.with(this@StayAc)
  2.             .load(it)
  3.             .into(binding.stayBlurBg)
  4.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
  5.             val blurEffect =
  6.                 RenderEffect.createBlurEffect(10f, 10f, Shader.TileMode.CLAMP)
  7.             binding.stayBlurBg.setRenderEffect(blurEffect)
  8.         }
复制代码
实现方式五:Blurry三方库

很老的库了,而且好久好久没更新了,提供了三种方法,但是试下来有两个无效
  1.   //不行
  2.   Blurry.with(context)
  3.     .radius(10)//模糊半径
  4.     .sampling(8)//缩放大小,先缩小再放大
  5.     .color(Color.argb(66, 255, 255, 0))//颜色
  6.     .async()//是否异步
  7.     .animate(500)//显示动画,目前仅支持淡入淡出,默认时间是300毫秒,仅支持传入控件为ViewGroup
  8.     .onto(viewGroup);
  9.   //不行
  10.   Blurry.with(context)
  11.     .radius(10)//模糊半径
  12.     .sampling(8)//缩放大小,先缩小再放大
  13.     .color(Color.argb(66, 255, 255, 0))//颜色
  14.     .async()//是否异步
  15.     .capture(view)//传入View
  16.     .into(view);//显示View
  17.    
  18.   //for bitmap 有效
  19.   Blurry.with(context)
  20.     .radius(10)//模糊半径
  21.     .sampling(8)//缩放大小,先缩小再放大
  22.     .color(Color.argb(66, 255, 255, 0))//颜色
  23.     .async()//是否异步
  24.     .from(bitmap)//传入bitmap
  25.     .into(view);//显示View
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表