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

调用Movie.draw(canvas)时出现错误。

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

有相关代码:
    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();
        }
    }

我在主要创建一个GIFView,调用上面的setGIF方法为其提供路径,并使用FillParent参数将其添加到布局中。
当我在ImageView中打印此图像时,它可以工作。
在 Canvas 上而不是GIF上绘制可绘制对象也可以。
因此,问题似乎与Movie实例有关。

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

我也尝试过这种方法,但是movie.draw上有同样的错误
Info about the Movie class for Android

编辑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设备上启动时出了点问题,但我不知道是什么:(

最佳答案

我找到了另一种解决方案-您只需要在绘制影片的特定 View 上禁用硬件加速器。使用下一行:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

引用(查看级别)
https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling

10-07 19:06
查看更多