java.lang.IllegalStateException:恢复时下溢 - 恢复多于保存

时间:2016-12-30 03:51:06

标签: android ripple rippledrawable

我正在为我的项目使用rippleeffect library。但在Android Nougat and Marshmallow中,由于此库导致应用程序崩溃:

compile 'com.github.traex.rippleeffect:library:1.3'

错误消息是:

  

致命的例外:主要       过程:com.test.testapp,PID:17713       java.lang.IllegalStateException:恢复时下溢 - 恢复多于保存       在android.graphics.Canvas.native_restore(本机方法)       在android.graphics.Canvas.restore(Canvas.java:522)       在com.andexert.library.RippleView.draw(RippleView.java:170)        ........................        ........................

就以下链接而言,这是一个已知问题。 https://github.com/traex/RippleEffect/issues/76我也尝试了很多来自stackoverflow的解决方案,但到目前为止运气确实很受欢迎!!!

可以采取哪些措施来解决这个问题?

3 个答案:

答案 0 :(得分:12)

我遇到了同样的问题,并没有找到一个好的解决方案。但是如果你

  • targetSdkVersion降级为22可以运行它:意味着它不会崩溃!但我真的推荐。
  • 尝试使用编译此依赖项来编译它 - > 'com.github.emanzanoaxa:RippleEffect:52ea2a0ab6'
  • 在每个canvas.save();之前致电restore(),这是您链接中的另一个建议,因为您可以尝试
  • 您还可以尝试在项目中添加该库并使用它

https://codeload.github.com/traex/RippleEffect/zip/master(根据您提供的链接,人们尝试使用这些解决方案)

或者我建议您自己创建它们,根本不需要库!

在Android 5.0(API级别21)中引入了

Ripple触摸效果,动画由新的RippleDrawable类实现。

一般情况下,常规按钮的涟漪效果在API 21中默认工作,对于其他可触摸视图,可以通过指定来实现:

android:background="?attr/selectItemBackground"

视图中包含的涟漪或:

android:background="?attr/selectItemBackgroundBorderless"

表示超出视图范围的涟漪。

您可以使用以下代码在代码中实现相同的目标:

int[] attrs = new int[]{R.attr.selectItemBackground};
TypedArray typedArray = getActivity().obtainStyledAttributes(attrs);
int backgroundResource = typedArray.getResourceId(0, 0);
myView.setBackgroundResource(backgroundResource);

如果您想在视图中自定义涟漪效果, 您需要在drawable目录中创建一个新的XML文件。

示例:

示例1 :无界波纹

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#ffff0000" />

示例2 :带面具和背景颜色的纹波

<ripple android:color="#7777666"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/mask"
        android:drawable="#ffff00" />
    <item android:drawable="@android:color/white"/>
</ripple>

示例3 :在可绘制资源上涟漪

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#ff0000ff">
    <item android:drawable="@drawable/my_drawable" />
</ripple>

如何使用 要将您的涟漪xml文件附加到任何视图,请将其设置为背景,如下所示: 假设您的ripple文件名为my_ripple.xml。例如1,2或3

<View 
    android:id="@+id/myViewId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/my_ripple" />

答案 1 :(得分:11)

他们修复了这个错误:P RippleEffect

答案 2 :(得分:0)

再次检查您的代码。您可能在某处还有一个 .restore()方法。