[英]java.lang.StackOverflowError: stack size 8MB
I am using this library to blur the area beneath my layout in android. 我正在使用这个库来模糊我在android中的布局下方的区域。 I am getting stackoverflowerror and activity crashes when the blur view is called.
调用模糊视图时,我收到stackoverflowerror和活动崩溃。 Please help.
请帮忙。 Thanks.
谢谢。
Here is the code with logcat 这是logcat的代码
BlurringView Activity BluringView活动
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicBlur;
import android.util.AttributeSet;
import android.view.View;
/**
* A custom view for presenting a dynamically blurred version of another view's content.
* <p/>
* Use {@link #setBlurredView(android.view.View)} to set up the reference to the view to be blurred.
* After that, call {@link #invalidate()} to trigger blurring whenever necessary.
*/
public class BlurringView extends View {
public BlurringView(Context context) {
this(context, null);
}
public BlurringView(Context context, AttributeSet attrs) {
super(context, attrs);
final Resources res = getResources();
final int defaultBlurRadius = res.getInteger(R.integer.default_blur_radius);
final int defaultDownsampleFactor = res.getInteger(R.integer.default_downsample_factor);
final int defaultOverlayColor = res.getColor(R.color.default_overlay_color);
initializeRenderScript(context);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PxBlurringView);
setBlurRadius(a.getInt(R.styleable.PxBlurringView_blurRadius, defaultBlurRadius));
setDownsampleFactor(a.getInt(R.styleable.PxBlurringView_downsampleFactor,
defaultDownsampleFactor));
setOverlayColor(a.getColor(R.styleable.PxBlurringView_overlayColor, defaultOverlayColor));
a.recycle();
}
public void setBlurredView(View blurredView) {
mBlurredView = blurredView;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mBlurredView != null) {
if (prepare()) {
// If the background of the blurred view is a color drawable, we use it to clear
// the blurring canvas, which ensures that edges of the child views are blurred
// as well; otherwise we clear the blurring canvas with a transparent color.
if (mBlurredView.getBackground() != null && mBlurredView.getBackground() instanceof ColorDrawable) {
mBitmapToBlur.eraseColor(((ColorDrawable) mBlurredView.getBackground()).getColor());
} else {
mBitmapToBlur.eraseColor(Color.TRANSPARENT);
}
mBlurredView.draw(mBlurringCanvas);
blur();
mBlurredView.invalidate();
canvas.save();
canvas.translate(mBlurredView.getX() - getX(), mBlurredView.getY() - getY());
canvas.scale(mDownsampleFactor, mDownsampleFactor);
canvas.drawBitmap(mBlurredBitmap, 0, 0, null);
canvas.restore();
}
canvas.drawColor(mOverlayColor);
}
}
public void setBlurRadius(int radius) {
mBlurScript.setRadius(radius);
}
public void setDownsampleFactor(int factor) {
if (factor <= 0) {
throw new IllegalArgumentException("Downsample factor must be greater than 0.");
}
if (mDownsampleFactor != factor) {
mDownsampleFactor = factor;
mDownsampleFactorChanged = true;
}
}
public void setOverlayColor(int color) {
mOverlayColor = color;
}
private void initializeRenderScript(Context context) {
mRenderScript = RenderScript.create(context);
mBlurScript = ScriptIntrinsicBlur.create(mRenderScript, Element.U8_4(mRenderScript));
}
protected boolean prepare() {
final int width = mBlurredView.getWidth();
final int height = mBlurredView.getHeight();
if (mBlurringCanvas == null || mDownsampleFactorChanged
|| mBlurredViewWidth != width || mBlurredViewHeight != height) {
mDownsampleFactorChanged = false;
mBlurredViewWidth = width;
mBlurredViewHeight = height;
int scaledWidth = width / mDownsampleFactor;
int scaledHeight = height / mDownsampleFactor;
// The following manipulation is to avoid some RenderScript artifacts at the edge.
scaledWidth = scaledWidth - scaledWidth % 4 + 4;
scaledHeight = scaledHeight - scaledHeight % 4 + 4;
if (mBlurredBitmap == null
|| mBlurredBitmap.getWidth() != scaledWidth
|| mBlurredBitmap.getHeight() != scaledHeight) {
mBitmapToBlur = Bitmap.createBitmap(scaledWidth, scaledHeight,
Bitmap.Config.ARGB_8888);
if (mBitmapToBlur == null) {
return false;
}
mBlurredBitmap = Bitmap.createBitmap(scaledWidth, scaledHeight,
Bitmap.Config.ARGB_8888);
if (mBlurredBitmap == null) {
return false;
}
}
mBlurringCanvas = new Canvas(mBitmapToBlur);
mBlurringCanvas.scale(1f / mDownsampleFactor, 1f / mDownsampleFactor);
mBlurInput = Allocation.createFromBitmap(mRenderScript, mBitmapToBlur,
Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
mBlurOutput = Allocation.createTyped(mRenderScript, mBlurInput.getType());
}
return true;
}
protected void blur() {
mBlurInput.copyFrom(mBitmapToBlur);
mBlurScript.setInput(mBlurInput);
mBlurScript.forEach(mBlurOutput);
mBlurOutput.copyTo(mBlurredBitmap);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mRenderScript != null) {
mRenderScript.destroy();
}
}
private int mDownsampleFactor;
private int mOverlayColor;
private View mBlurredView;
private int mBlurredViewWidth, mBlurredViewHeight;
private boolean mDownsampleFactorChanged;
private Bitmap mBitmapToBlur, mBlurredBitmap;
private Canvas mBlurringCanvas;
private RenderScript mRenderScript;
private ScriptIntrinsicBlur mBlurScript;
private Allocation mBlurInput, mBlurOutput;
}
MyActivity class MyActivity类
BlurringView blurringView = (BlurringView) addView.findViewById(R.id.circle);
blurringView.setBlurredView(blurringView);
blurringView.invalidate();
Logcat Error Logcat错误
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.user.designsample, PID: 19998 java.lang.StackOverflowError: stack size 8MB at android.graphics.Canvas.drawOval(Canvas.java:1155) at android.graphics.Canvas.drawOval(Canvas.java:1147) at android.graphics.drawable.GradientDrawable.draw(GradientDrawable.java:615) at android.view.View.drawBackground(View.java:16376) at android.view.View.draw(View.java:16175) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundred 05-05 23:16:31.323 19998-19998/com.example.user.humandesignsample E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 6333780) 05-05 23:16:31.361 19998-19998/com.example.user.humandesignsample E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException: data parcel size 6333780 bytes at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(Binder.java:503) at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4425) at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:90) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
The problem is most certainly with this line: 问题最肯定与以下行有关:
blurringView.setBlurredView(blurringView);
You're assigning the BlurringView
to itself. 您正在将
BlurringView
分配给它自己。 It doesn't make any sense. 这没有任何意义。 What I assume (I don't want to read the whole
BlurringView
class), setBlurredView
is used for the View
you want to blur. 我想什么(我不想读取整个
BlurringView
类), setBlurredView
用于View
要模糊。 And the BlurringView
will act as a blur
overlay. 并且
BlurringView
将充当blur
叠加层。 So assigning the blur
overlay to be "blurred"
doesn't make any sense at all. 因此,将
blur
叠加层指定为"blurred"
根本没有任何意义。
try it like this 这样尝试
blurringView.setBlurredView(the_view_which_you_want_to_blur);
that's it 而已
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.