禁用硬件加速,向后兼容

问题描述:

我有一个函数(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);“,它会抛出一个硬错误之前任何代码可以运行。

由于您已经使用反射来运行代码,因此无论如何您都不需要该代码行。

+0

不错的解决方案!谢谢它适用于我 – 2014-04-17 15:42:32

这应该是有用的: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

+1

'安卓hardwareAccelerated'可从API级别11,所以我不能用它 – Arkde 2012-03-27 10:56:40

+0

我试着对API为14和16并没有在所有的工作! :( – 3c71 2012-10-13 09:13:07

我无法让它与您的代码一起工作。我发现的问题是方法类型参数化。此外,您并未在您希望设置硬件加速的视图上调用该方法。这是我的解决方案:

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); 
    } 
} 
+0

这真实地不做任何事情,你目前无法为单一视图开启硬件加速功能据此:http://developer.android.com/guide/topics/graphics/hardware- accel.html – snapix 2013-04-12 08:58:44

+0

@snapix你可以关闭但不能打开 – infografnet 2013-06-20 14:12:43

+0

如何打开? – 2015-12-21 04:24:53