有没有办法只对android 4.0.3禁用硬件加速?

有没有办法只对android 4.0.3禁用硬件加速?,android,android-4.0-ice-cream-sandwich,Android,Android 4.0 Ice Cream Sandwich,我最近偶然发现了android 4.0.3的一个问题,在这个问题上,我会在应用程序启动后立即得到以下异常(在其他android版本上,它工作正常): 这与启用硬件加速有关,只要我在清单上禁用它,应用程序就会开始正常工作 通过搜索,我在Romain Guy的一些对话中发现了一个(在“drawPatch”的文档搜索中),他讨论了一些可能导致这种情况的原因,虽然没有提出解决方法或修复方案,但我想知道我是否应该只为这个版本的android禁用硬件加速,或者是否有解决方法 谢谢您的时间。所以A-C在评论中

我最近偶然发现了android 4.0.3的一个问题,在这个问题上,我会在应用程序启动后立即得到以下异常(在其他android版本上,它工作正常):

这与启用硬件加速有关,只要我在清单上禁用它,应用程序就会开始正常工作

通过搜索,我在Romain Guy的一些对话中发现了一个(在“drawPatch”的文档搜索中),他讨论了一些可能导致这种情况的原因,虽然没有提出解决方法或修复方案,但我想知道我是否应该只为这个版本的android禁用硬件加速,或者是否有解决方法


谢谢您的时间。

所以A-C在评论中提到了这一点,但让我详细说明一下

可以在值文件中创建布尔值,并将其粘贴到正确的版本文件夹中。在你的舱单上 查看此帖子:

看起来您将要以v15/bools.xml为目标值


当前无法通过代码在窗口级别禁用硬件加速

只启用它。我建议您在清单中默认禁用它:

<application android:hardwareAccelerated="false">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>
可以使用以下代码在运行时禁用单个视图的硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

此信息可在

中找到。这是一个有趣的错误,因为硬件加速正在工作(有时)。过去几天我一直在寻找这个问题的答案。它在ICS中有记录,但我在我的一款测试手机中注意到它,一款运行4.1.2的三星Galaxy S3,大多数人建议关闭硬件加速。我不想这样做,因为硬件加速使我的动画非常流畅。因此,我发现,如果我重写draw()并尝试捕获空指针异常,硬件加速功能将正常工作(大部分时间),并且足以让您永远不会注意到它们不工作或引发异常。 在我的例子中,我正在做一个自定义视图,并且有一些自定义绘图要做。对null的简单检查不起作用(canvas==null),这就是为什么这个bug很麻烦的原因。所以我做的是:

    @Override
public void draw(Canvas canvas) {
    try{
        super.draw(canvas);
        mCanvas=canvas;
    }catch(java.lang.NullPointerException e){
        Log.e("mytag","MyCustomView::draw():"+e);
    }
    if(mCanvas==null)
        return;     
...

然后默默地尝试并捕捉到单个draw语句中的任何NPE。第一次看到这个bug时,我用try-and-catch将整个draw()代码包围起来。这对大多数手机都有效,但在运行4.1.2的三星s3上,它会引起闪烁。因此,我使用了上述方法,在每次调用someObject.draw(mCanvas)时都进行了静默尝试捕获,从而完全消除了所有闪烁现象(硬件加速视图缓存和新画布之间的差异)。希望这有帮助!比关掉华好得多

我喜欢@sgarman链接的答案,因为它对代码的影响最小,并且易于维护。为了扩展该链接,我只对Android v4.0.3和某个特定活动禁用了硬件加速,这对我很有效(请记住将指定版本和编码的xml头添加到各种bool.xml文件中,因为wiki编辑器不允许我粘贴它):

AndroidManifest.xml:标识承载有问题视图的活动,并将其插入该活动:

<activity
    android:hardwareAccelerated="@bool/isNotIceCreamSandwich"
    ...
</activity>

有一种方法可以根据API进行修改。这是他们提供的代码:
myView.setLayerType(View.LAYER\u TYPE\u软件,null)您需要一个检查API版本的if语句,然后使用上面的代码。@A--C谢谢,这将需要为每个视图执行此操作,是否可以使用代码在应用程序级别更改它,我的意思是在AndroidManifest文件之外?我不这么认为,似乎您只能指定您的应用程序是硬件加速的,并且是全局的,没有特定的API版本。您可以做的一件事是创建一个特殊的API布局文件夹(layout-v13或任何4.03的API),并在xml中设置每个视图的类型。谢谢,我试试这个,这是4.0.3中的常见问题吗?显然,对于2d视图,硬件加速在4.0.3上不是那么稳定。我不确定,也许是我解决了你提出的问题而不是找到加速问题的实际解决方案。在使用此解决方案之前,我会继续调查。是否有办法在布局XML文件中设置“android:layerType”,以便使用此方法设置正确的值?系统如何知道
IsnoticeReamSandwich
version code?重要提示:android开发人员还说:“记住此标志很重要在设置活动或对话框的内容视图之前,必须先设置(参考“标志硬件加速”)
    @Override
public void draw(Canvas canvas) {
    try{
        super.draw(canvas);
        mCanvas=canvas;
    }catch(java.lang.NullPointerException e){
        Log.e("mytag","MyCustomView::draw():"+e);
    }
    if(mCanvas==null)
        return;     
...
<activity
    android:hardwareAccelerated="@bool/isNotIceCreamSandwich"
    ...
</activity>
<resources>
    <bool name="isNotIceCreamSandwich">true</bool>
</resources>
<resources>
    <bool name="isNotIceCreamSandwich">false</bool>
</resources>
<resources>
    <bool name="isNotIceCreamSandwich">true</bool>
</resources>