Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -138,5 +138,5 @@ dependencies {
implementation "com.facebook.react:react-native:+"
// From node_modules

implementation 'com.github.Dimezis:BlurView:version-2.0.3'
implementation 'com.github.Dimezis:BlurView:version-2.0.4'
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
package com.reactnativecommunity.blurview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.os.Build;
import android.util.Log;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;

import com.facebook.react.views.view.ReactViewGroup;

import eightbitlab.com.blurview.BlurAlgorithm;
import eightbitlab.com.blurview.BlurController;
import eightbitlab.com.blurview.BlurViewFacade;
import eightbitlab.com.blurview.NoOpController;
import eightbitlab.com.blurview.PreDrawBlurController;
import eightbitlab.com.blurview.RenderEffectBlur;
import eightbitlab.com.blurview.RenderScriptBlur;

/**
* ReactViewGroup that blurs its underlying content.
* Can have children and draw them over blurred background.
*/
public class ReactBlurView extends ReactViewGroup {

private static final String TAG = ReactBlurView.class.getSimpleName();
private String blurType;

private final Paint overlayPaint;

BlurController blurController = new NoOpController();

public ReactBlurView(Context context) {
super(context);
setOutlineProvider(ViewOutlineProvider.BACKGROUND);
setClipToOutline(true);
overlayPaint = new Paint();
setBlurType("dark");
}

@Override
public void draw(Canvas canvas) {
boolean shouldDraw = blurController.draw(canvas);
if (shouldDraw) {
if (overlayPaint.getColor() != Color.TRANSPARENT) {
canvas.drawPaint(overlayPaint);
}
super.draw(canvas);
}
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
blurController.updateBlurViewSize();
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
blurController.setBlurAutoUpdate(false);
}

@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (!isHardwareAccelerated()) {
Log.e(TAG, "BlurView can't be used in not hardware-accelerated window!");
} else {
blurController.setBlurAutoUpdate(true);
}
}

public BlurViewFacade setupWith(@NonNull ViewGroup rootView, BlurAlgorithm algorithm) {
this.blurController.destroy();
BlurController blurController = new PreDrawBlurController(this, rootView, getOverlayColor(), algorithm);
this.blurController = blurController;
return blurController;
}

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
public BlurViewFacade setupWith(@NonNull ViewGroup rootView) {
return setupWith(rootView, getBlurAlgorithm());
}

public BlurViewFacade setBlurRadius(float radius) {
return blurController.setBlurRadius(radius);
}

public BlurViewFacade setBlurType(String type) {
blurType = type;
overlayPaint.setXfermode(getXfermode());
overlayPaint.setColor(getOverlayColor());
return blurController;
}

public BlurViewFacade setBlurAutoUpdate(boolean enabled) {
return blurController.setBlurAutoUpdate(enabled);
}

public BlurViewFacade setBlurEnabled(boolean enabled) {
return blurController.setBlurEnabled(enabled);
}

@Override
public void setBackgroundColor(int color) {
blurController.setOverlayColor(color);
}

@NonNull
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
private BlurAlgorithm getBlurAlgorithm() {
BlurAlgorithm algorithm;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
algorithm = new RenderEffectBlur();
} else {
algorithm = new RenderScriptBlur(getContext());
}
return algorithm;
}

private int getOverlayColor() {
switch (blurType) {
case "xlight":
return 0xFFBEBEBE;
case "light":
return 0xFFD2D2D2;
default:
return 0xFFAAAAAA;
}
}

private PorterDuffXfermode getXfermode() {
switch (blurType) {
case "xlight":
return new PorterDuffXfermode(PorterDuff.Mode.SCREEN);
case "light":
return new PorterDuffXfermode(PorterDuff.Mode.OVERLAY);
default:
return new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);
}
}
}
1 change: 0 additions & 1 deletion android/src/main/res/values/attr.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@
<declare-styleable name="BlurringView">
<attr name="blurRadius" format="integer"/>
<attr name="downsampleFactor" format="integer"/>
<attr name="overlayColor" format="color"/>
</declare-styleable>
</resources>
1 change: 0 additions & 1 deletion android/src/main/res/values/defaults.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@
<resources>
<integer name="default_blur_radius">15</integer>
<integer name="default_downsample_factor">8</integer>
<color name="default_overlay_color">#AAFFFFFF</color>
</resources>
Original file line number Diff line number Diff line change
@@ -1,53 +1,53 @@
package com.reactnativecommunity.blurview;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;

import eightbitlab.com.blurview.BlurView;

class BlurViewManager extends ViewGroupManager<BlurView> {

ReactApplicationContext mCallerContext;

public BlurViewManager(ReactApplicationContext reactContext) {
mCallerContext = reactContext;
}

@Override
public BlurView createViewInstance(ThemedReactContext context) {
return BlurViewManagerImpl.createViewInstance(context);
}

@NonNull
@Override
public String getName() {
return BlurViewManagerImpl.REACT_CLASS;
}

@ReactProp(name = "blurRadius", defaultInt = BlurViewManagerImpl.defaultRadius)
public void setRadius(BlurView view, int radius) {
BlurViewManagerImpl.setRadius(view, radius);
}

@ReactProp(name = "overlayColor", customType = "Color")
public void setColor(BlurView view, int color) {
BlurViewManagerImpl.setColor(view, color);
}

@ReactProp(name = "downsampleFactor", defaultInt = BlurViewManagerImpl.defaultSampling)
public void setDownsampleFactor(BlurView view, int factor) {}

@ReactProp(name = "autoUpdate", defaultBoolean = true)
public void setAutoUpdate(BlurView view, boolean autoUpdate) {
BlurViewManagerImpl.setAutoUpdate(view, autoUpdate);
}

@ReactProp(name = "enabled", defaultBoolean = true)
public void setBlurEnabled(BlurView view, boolean enabled) {
BlurViewManagerImpl.setBlurEnabled(view, enabled);
}
}
package com.reactnativecommunity.blurview;
import androidx.annotation.NonNull;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;
import eightbitlab.com.blurview.BlurView;
class BlurViewManager extends ViewGroupManager<BlurView> {
ReactApplicationContext mCallerContext;
public BlurViewManager(ReactApplicationContext reactContext) {
mCallerContext = reactContext;
}
@Override
public BlurView createViewInstance(ThemedReactContext context) {
return BlurViewManagerImpl.createViewInstance(context);
}
@NonNull
@Override
public String getName() {
return BlurViewManagerImpl.REACT_CLASS;
}
@ReactProp(name = "blurRadius", defaultInt = BlurViewManagerImpl.defaultRadius)
public void setRadius(BlurView view, int radius) {
BlurViewManagerImpl.setRadius(view, radius);
}
@ReactProp(name = "overlayColor", customType = "Color")
public void setColor(BlurView view, int color) {
BlurViewManagerImpl.setColor(view, color);
}
@ReactProp(name = "downsampleFactor", defaultInt = BlurViewManagerImpl.defaultSampling)
public void setDownsampleFactor(BlurView view, int factor) {}
@ReactProp(name = "autoUpdate", defaultBoolean = true)
public void setAutoUpdate(BlurView view, boolean autoUpdate) {
BlurViewManagerImpl.setAutoUpdate(view, autoUpdate);
}
@ReactProp(name = "enabled", defaultBoolean = true)
public void setBlurEnabled(BlurView view, boolean enabled) {
BlurViewManagerImpl.setBlurEnabled(view, enabled);
}
}
Loading