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设备上启动时出现问题,但我无法弄清楚是什么:(
最后!我找到了答案,看来在某些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
| 归档时间: |
|
| 查看次数: |
1122 次 |
| 最近记录: |