禁用硬件加速,向后兼容
我有一个函数(setLayerType(LAYER_TYPE_NONE, null)
)在api> = 11中有问题,我的代码也应该在android 1.6(API级别4)上运行。 我曾尝试使用反射像这样:禁用硬件加速,向后兼容
try {
Method method = View.class.getMethod("setLayerType", Integer.TYPE, null);
method.invoke(LAYER_TYPE_NONE, null);
view.setLayerType(LAYER_TYPE_NONE, null);
} catch (Throwable e) {
Log.e("_________________test", "Function not found");
}
但view.setLayerType与java.lang.VerifyError的我的应用程序崩溃....
没有任何人有任何想法,我怎么能解决这个崩溃并在较低级别的API中获得与此功能的后向兼容性?
感谢, Arkde
刚删除
view.setLayerType(LAYER_TYPE_NONE, null);
你应该没问题,出于安全原因,Java/Android首先会验证它在运行之前至少有一个运行给定类的镜头,而在较早的Android OS上它不知道如何执行“ view.setLayerType(LAYER_TYPE_NONE,null);“,它会抛出一个硬错误之前任何代码可以运行。
由于您已经使用反射来运行代码,因此无论如何您都不需要该代码行。
这应该是有用的:http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html
如果真的有事情做与硬件加速,你可以添加以下到您的清单:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
源: http://developer.android.com/guide/topics/graphics/hardware-accel.html
我无法让它与您的代码一起工作。我发现的问题是方法类型参数化。此外,您并未在您希望设置硬件加速的视图上调用该方法。这是我的解决方案:
public static void setHardwareAccelerated(View view){
try {
Method method = View.class.getMethod("setLayerType", int.class, Paint.class);
method.invoke(view, View.LAYER_TYPE_HARDWARE, null);
} catch (Exception e) {
Log.e("RD", "Hardware Acceleration not supported on API " + android.os.Build.VERSION.SDK_INT, e);
}
}
这真实地不做任何事情,你目前无法为单一视图开启硬件加速功能据此:http://developer.android.com/guide/topics/graphics/hardware- accel.html – snapix 2013-04-12 08:58:44
@snapix你可以关闭但不能打开 – infografnet 2013-06-20 14:12:43
如何打开? – 2015-12-21 04:24:53
不错的解决方案!谢谢它适用于我 – 2014-04-17 15:42:32