禁用硬件加速,向后兼容性。

4

我有一个与函数 (setLayerType(LAYER_TYPE_NONE, null)) 相关的问题,该函数在 api >=11 中可用,而我的代码也应该在 android 1.6 (API level 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

3个回答

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

硬件加速是一种可以提高应用程序性能的技术。它通过利用图形处理器(GPU)来加速绘制过程,从而减轻了中央处理器(CPU)的负担。Android 3.0及以上版本支持硬件加速。要启用硬件加速,请在应用程序主题中设置android:hardwareAccelerated属性为true。但是,在某些情况下,硬件加速可能会导致不良后果,例如视觉伪影或绘图错误。因此,在使用硬件加速时,需要测试并根据实际情况进行调整。


1
android:hardwareAccelerated 自 API 等级 11 开始可用,所以我无法使用它。 - Aurelian Cotuna

4
只需移除


view.setLayerType(LAYER_TYPE_NONE, null);

出于安全考虑,Java/Android在继续执行给定类之前会先验证其是否有运行的可能性,在旧版Android操作系统上,它不知道如何执行“view.setLayerType(LAYER_TYPE_NONE, null);”,因此在该类的任何代码运行之前,它会抛出严重错误。

由于您使用反射运行了代码,因此您不需要那行代码。


1

我无法通过您的代码让它正常工作。我发现的问题在于方法类型参数化上。而且,您没有在希望设置硬件加速的视图上调用该方法。这是我的解决方案:

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
@snapix 你可以关闭,但你无法打开。 - infografnet
@DuyenHangKim,你可以通过调用以下代码来开启它:getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); - Ryan Amaral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接