【问题标题】:Disable hardware acceleration, backward compatibility禁用硬件加速,向后兼容
【发布时间】:2012-03-27 09:30:25
【问题描述】:

我对 api >=11 中可用的函数 (setLayerType(LAYER_TYPE_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 中获得与此功能的向后兼容性?

谢谢, 方舟

【问题讨论】:

    标签: android compatibility


    【解决方案1】:

    只需删除

    view.setLayerType(LAYER_TYPE_NONE, null);
    

    您应该没问题,出于安全原因,Java/Android 将首先验证它是否至少可以在继续之前运行给定的类,并且在较旧的 Android 操作系统上它不知道如何执行“view. setLayerType(LAYER_TYPE_NONE, null);",它会在该类的任何代码运行之前抛出一个硬错误。

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

    【讨论】:

      【解决方案2】:

      这应该很有用:http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html

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

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

      src:http://developer.android.com/guide/topics/graphics/hardware-accel.html

      【讨论】:

      • android:hardwareAccelerated 从 api 级别 11 可用,所以我不能使用它
      【解决方案3】:

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

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

      【讨论】:

      • 这实际上什么也没做。您目前无法为单视图打开硬件加速。据此:developer.android.com/guide/topics/graphics/hardware-accel.html
      • @snapix 你可以关闭但你不能打开。
      • @DuyenHangKim 您可以通过调用将其打开:getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多