nbwzlyd / realTimeBlurView2

一个实时高斯模糊方案,支持任意图形,(只要你能画出来)任意覆盖色。
95 stars 11 forks source link

realTimeBlurView2

一个实时高斯模糊方案,支持任意图形,(只要你能画出来)任意覆盖色。

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也好修复。