Android 禁用硬件加速、向后兼容性

Android 禁用硬件加速、向后兼容性,android,compatibility,Android,Compatibility,api>=11中提供的函数(setLayerType(LAYER\u TYPE\u NONE,null))有问题,我的代码也应该在android 1.6(api级别4)上运行。 我尝试过这样使用反射: try { Method method = View.class.getMethod("setLayerType", Integer.TYPE, null); method.invoke(LAYER_TYPE_NONE, null); view.s

api>=11中提供的函数(
setLayerType(LAYER\u TYPE\u NONE,null)
)有问题,我的代码也应该在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

这应该很有用:

如果它确实与硬件加速有关,您可以在清单中添加以下内容:

<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>

只需删除

view.setLayerType(LAYER_TYPE_NONE, null);
您应该很好,出于安全原因,Java/Android在继续之前会首先验证它至少有一次运行给定类的机会,而在较旧的Android操作系统上,它不知道如何执行“view.setLayerType(LAYER_TYPE_NONE,null);”,它会在运行该类中的任何代码之前抛出一个硬错误


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

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

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

android:hardwareAccelerated
可以从api级别11获得,所以我不能使用它。实际上,它什么都不做。当前无法为单个视图启用硬件加速。据此:@snapix可以关闭,但不能打开。@DuyenHangKim您可以通过调用:
getWindow().setFlags(WindowManager.LayoutParams.FLAG\u HARDWARE\u ACCELERATED,WindowManager.LayoutParams.FLAG\u HARDWARE\u ACCELERATED)来打开它