github上也有高斯模糊的方案,但不是实时的,原理上是截取背景图的一个cacheView,然后对这个cacheView进行高斯模糊,再设置成view的背景。所以一旦更改了需要高斯模糊的图,高斯模糊的效果却还是上一张的,该方案也可以达到实时效果,但是性能GG,要对view不断取cacheView,再创建新的bitmap,危险系数高,而我这个是实时更新的,利用canvas的层级这一原理,不用过多的进行bitmap操作
性能上个人觉得还可以吧,如果你觉得卡,可以设置一下RealtimeBlurView_realtimeDownsampleFactor 默认是4 ,值大的话卡顿效果会好一点 原理就是在创建bitmap时候并不是创建实际大小的,而是会先缩放,再高斯模糊,再放大,这样性能会更好
支持高斯模糊覆盖色 RealtimeBlurView_realtimeOverlayColor 圆角模式 圆形模式 任意模式
使用方法很简单,在你需要高斯模糊的图上,像布局一样写就行了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/RecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<View.RealtimeBlurView
android:layout_marginTop="10dp"
android:id="@+id/RealtimeBlurView"
android:layout_width="300dp"
android:layout_height="150dp"
android:layout_centerHorizontal="true"/>
<View.RoundCornerBlurView
android:id="@+id/RoundCornerBlurView"
android:layout_width="match_parent"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_height="150dp"
android:layout_below="@id/RealtimeBlurView"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp"
app:realtimeBlurRoundCornerRadius="6dp"
app:realtimeOverlayColor="#5a4B0082"/>
</RelativeLayout>
如果你觉得这样性能不好,你可以单独设置要高斯模糊的图片,利用bindView(View targetView)方法,(记得屏蔽onAttachedToWindow)
public RealtimeBlurView bindView(View targetView) {
mTargetView = targetView;
post(new Runnable() {
@Override
public void run() {
mTargetView.getViewTreeObserver().addOnPreDrawListener(mBlurPreDrawListener);
}
});
return this;
}
用FastBlur实现,兼容性上没问题,性能上,看你的设置了 realtimeBlurRadius 和realtimeDownsampleFactor
其中realtimeBlurRadius不要超过25。
我自己测试,模糊也就几毫秒的时间,很不错了。
鄙人不太喜欢写库也没能力写很牛逼的库,代码写的都很简单。人人都能看懂
我也是参考的github上大神的代码,做了适度精简,替换了renderscript方案,采用fastBlur,兼容性好,逻辑更清晰,但是健壮性就差很多了,拿来自己用,bug也好修复。