我正在为我的项目使用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的解决方案,但到目前为止运气确实很受欢迎!!!
可以采取哪些措施来解决这个问题?
答案 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)
答案 2 :(得分:0)
再次检查您的代码。您可能在某处还有一个 .restore()方法。