当我在textview上应用TransitionDrawable时出现stackoverflow错误:
private static void applyAnimationTransitionBackground(String descriptorValue, final Resources resources, View view){
Drawable currentBackground;
TransitionDrawable td;
if (view!=null){
//Get current background or transparent color
currentBackground = view.getBackground();
if (currentBackground==null){
currentBackground = new ColorDrawable(android.R.color.transparent);
}
//Create transition depend on trend
if (descriptorValue.equals("1")){
td= new TransitionDrawable (new Drawable []{currentBackground, new ColorDrawable(resources.getColor(R.color.positive_animation))});
}else if (descriptorValue.equals("2")){
td= new TransitionDrawable (new Drawable []{currentBackground, new ColorDrawable(resources.getColor(R.color.neutral_animation))});
}else{
td= new TransitionDrawable (new Drawable []{currentBackground, new ColorDrawable(resources.getColor(R.color.negative_animation))});
}
//Apply animation
if (td!=null){
view.setBackgroundDrawable(td);
td.startTransition(500);
//td.reverseTransition(500);
}else{
Logger.error("applyAnimationTransitionBackground: TransitionDrawable is NULL");
}
}
}
02-12 17:00:12.899: I/System.out(11217): ---> M SAN nuevo valor 1,52%
02-12 17:00:12.907: I/System.out(11217): ---> M SAN nuevo valor SANTANDER
02-12 17:00:12.907: W/Resources(11217): Converting to string: TypedValue{t=0x11/d=0x55 a=-1}
02-12 17:00:12.907: W/Resources(11217): Converting to string: TypedValue{t=0x10/d=0xfffffffe a=-1}
02-12 17:00:12.915: I/System.out(11217): ---> M SAN nuevo valor 1,52%
02-12 17:00:12.915: I/System.out(11217): ---> M SAN nuevo valor SANTANDER
02-12 17:00:12.915: W/Resources(11217): Converting to string: TypedValue{t=0x11/d=0x55 a=-1}
02-12 17:00:12.915: W/Resources(11217): Converting to string: TypedValue{t=0x10/d=0xfffffffe a=-1}
02-12 17:00:12.915: I/dalvikvm(11217): threadid=1: stack overflow on call to Landroid/view/GLES20Canvas;.setupModifiers:IL
02-12 17:00:12.915: I/dalvikvm(11217): method requires 40+20+20=80 bytes, fp is 0x4016b324 (36 left)
02-12 17:00:12.915: I/dalvikvm(11217): expanding stack end (0x4016b300 to 0x4016b000)
02-12 17:00:12.915: I/dalvikvm(11217): Shrank stack (to 0x4016b300, curFrame is 0x4016e420)
02-12 17:00:12.915: D/AndroidRuntime(11217): Shutting down VM
02-12 17:00:12.915: W/dalvikvm(11217): threadid=1: thread exiting with uncaught exception (group=0x40bd91f8)
02-12 17:00:12.961: E/AndroidRuntime(11217): FATAL EXCEPTION: main
02-12 17:00:12.961: E/AndroidRuntime(11217): java.lang.StackOverflowError
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.view.GLES20Canvas.drawRect(GLES20Canvas.java:942)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.view.GLES20RecordingCanvas.drawRect(GLES20RecordingCanvas.java:226)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.view.GLES20Canvas.drawRect(GLES20Canvas.java:952)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.view.GLES20RecordingCanvas.drawRect(GLES20RecordingCanvas.java:232)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.ColorDrawable.draw(ColorDrawable.java:70)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
02-12 17:00:12.961: E/AndroidRuntime(11217): at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:195)
答案 0 :(得分:0)
我几乎肯定你在一个循环中调用applyAnimationTransitionBackground()
,例如onDrawFrame()
的{{1}}(我说这只是因为我看到了GL ES的使用但它可能是某种动画或其他东西)。
我这么认为是因为你设置了Renderer
的背景。首先,view
的背景是两种颜色之间的过渡 - 我们称之为view
。对于每次连续调用,T(C1, C2)
的背景设置为可在以下之间绘制的过渡:
view
和实际上:
view
背景设置为转换view
。T(T(C1, C2), C3)
背景设置为转换view
。实际上,即使在100次调用之后,您也可以将背景绘制设置为100个过渡可绘制的大量组合。您可以想象在对方法进行1000次或10000次调用后发生的情况。由于转换drawable只是将绘图委托给它们的组件drawable,所以最终会出现堆栈溢出。
检查是否完全相同的最简单方法是将行T(T(T(C1, C2), C3), C4)
放在Logger.info("call");
的开头。如果您在日志中看到很多applyAnimationTransitionBackground()
条消息(LogCat),那么就是这种情况。
要解决这个问题,您只需要从这种组合drawable的模式中退出。例如,您可以保存用于转换的最后颜色值及其开始时间。然后,当您需要在当前颜色和新颜色之间创建过渡时,可以使用保存的开始时间和颜色来插入背景的当前颜色。然后,您可以简单地创建一个新的可转换的过渡 - 在当前颜色和新颜色之间。