Android 当电影进入 canvas 时出现错误信号 11
Android error signal 11 when a movie draws into a canvas
我正在开发一个 Android 应用程序,我试图在其中显示 GIF 图像。
为此,我正在使用 Movie class 并创建了一个扩展 View 的 class 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();
}
}
我在 main 中创建了一个 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 设备上启动时出了点问题,但我不知道是什么:(
终于!
我找到了答案,似乎在某些 Android 版本或设备上需要禁用硬件加速。
我刚刚将此添加到我的清单中:
<application android:hardwareAccelerated="true" ...>
有关使用 enabling/disabling 硬件加速的更多信息,请参见 here。
我找到了另一个解决方案 - 您必须仅在您绘制影片的特定视图上禁用硬件加速器。使用下一行:
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
参考(视图级别)
https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling
我正在开发一个 Android 应用程序,我试图在其中显示 GIF 图像。 为此,我正在使用 Movie class 并创建了一个扩展 View 的 class 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();
}
}
我在 main 中创建了一个 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 设备上启动时出了点问题,但我不知道是什么:(
终于!
我找到了答案,似乎在某些 Android 版本或设备上需要禁用硬件加速。
我刚刚将此添加到我的清单中:
<application android:hardwareAccelerated="true" ...>
有关使用 enabling/disabling 硬件加速的更多信息,请参见 here。
我找到了另一个解决方案 - 您必须仅在您绘制影片的特定视图上禁用硬件加速器。使用下一行:
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
参考(视图级别) https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling