电影绘制到画布时的Android错误信号11

Vro*_*ong 5 java android canvas view gif

我正在开发一个Android应用程序,我正在尝试显示GIF图像.为此,我使用Movie类并创建了一个扩展View的类GIFView.我从Movie.decodeFile方法获取一个Movie实例.

调用Movie.draw(画布)时出现错误.

04-28 13:44:18.001: A/libc(24883): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 24883 (mple.channel002) 
Run Code Online (Sandbox Code Playgroud)

有相关的代码:

    public void setGif(File gif)
    {
        movie = Movie.decodeFile(gif.getAbsolutePath());
    }

    @Override
    public void draw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.draw(canvas);
        canvas.drawColor(0xFFCC3C6C);            

        if(movie != null)
        {
            if(movieStart == 0)
                movieStart = android.os.SystemClock.uptimeMillis();
            int duration = Math.max(movie.duration(), 1000);
            movie.setTime((int)(duration - ((android.os.SystemClock.uptimeMillis() - movieStart)%duration)));

            movie.draw(canvas, 10, 10);//TODO CRASH

            invalidate();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我在main中创建一个GIFView,调用上面的setGIF方法为它提供路径并使用FillParent参数将其添加到布局中.当我在ImageView中打印此图像时,它可以工作.在画布中绘制一个drawable而不是GIF也可以.所以问题似乎是处理Movie实例.

我使用这些链接制作了GIFView http://weavora.com/blog/2012/02/07/android-and-how-to-use-animated-gifs/

我也尝试过这种方式但在movie.draw上的相同错误关于 Android的Movie类的信息

编辑1:我在Android 4.4.2/snapdragon 801/2GB上对Oppo Find 7a进行测试将movie.draw(canvas,10,10)更改为movie.draw(canvas,10f,10f)不会改变任何内容.

编辑2:我刚刚在一台旧的中兴通讯设备上使用Android 2.3.5进行了测试,并且它运行了..所以在Find7a设备上启动时出现问题,但我无法弄清楚是什么:(

Vro*_*ong 5

最后!我找到了答案,看来在某些Android版本或设备上需要禁用硬件加速.
我刚把这个添加到我的清单中:

<application android:hardwareAccelerated="true" ...>
Run Code Online (Sandbox Code Playgroud)

有关使用启用/禁用硬件加速的更多信息,请参见此处.


小智 5

我找到了另一个解决方案 - 您必须仅在您绘制电影的特定视图上禁用硬件加速器.使用下一行:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
Run Code Online (Sandbox Code Playgroud)

参考(视图级别) https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling