如何在 android 中从 url 播放动画 GIF 图像?
Posted
技术标签:
【中文标题】如何在 android 中从 url 播放动画 GIF 图像?【英文标题】:How to play animated GIF image from url in android? 【发布时间】:2014-12-29 23:34:27 【问题描述】:我正在将 giphy 集成到我的 android 应用中..
如何在 Android 中播放来自 URL 的 animated gif
图像?我应该使用ImageView, WebView, VideoView
等吗?例如,如果我想从this URL 播放动画。
【问题讨论】:
***.com/questions/3660209/display-animated-gif developer.android.com/reference/android/graphics/drawable/… 如果你做过研发,那么你就可以找到它。 gayashan-a.blogspot.in/2012/02/…,android-er.blogspot.in/2014/03/…,androidsurya.blogspot.in/2014/03/… 最好的选择就是在 webview 中打开那个 url。 @Dev 我试过了,但看起来我打开了网站,因为它显示了所有选项..我只是希望用户看到动画 gif..我尝试了 Javanator 编写的内容,它非常适合他提供的网址但不适用于我的网址.. 【参考方案1】:只需创建一个 html 字符串并将其加载到 android webview 中。经过测试的解决方案。
http://developer.android.com/reference/android/webkit/WebView.html#loadData(java.lang.String, java.lang.String, java.lang.String)
String x = "<!DOCTYPE html><html><body><img src=\"http://goo.gl/uPJ9P2\" alt=\"Smileyface\" width=\"100%\" height=\"100%\"></body></html>";
webView.loadData(x, "text/html", "utf-8");
【讨论】:
这样我应该把 url 放在 String x=" giphy.com/gifs/funny-cat-DFiwMapItOTh6</body></…>" 你能写出我应该在字符串 x 中放什么吗?你上面给出的代码没有开始的正文标签,但有一个结束的正文标签?并且是 img 一个标签?谢谢你时间... @user3753273 立即查看 String x = "giphy.com/gifs/funny-cat-DFiwMapItOTh6" >";我试过了,但它在代码“插入”中显示错误;“完成LocalVariableDeclarationStatement”..可能是因为引号..如果我删除所有引号应用程序运行但它显示空白webview...我是否应该使用引号..我更新鲜了..谢谢你的时间... 如果我复制粘贴你的代码也显示语法错误,插入“;”完成 LocalVariableDeclarationStatement【参考方案2】:试试这个方法
Movie movie;
GifView(Context context)
super(context);
movie = Movie.decodeStream(
context.getResources().openRawResource(
R.drawable.some_gif));
@Override
protected void onDraw(Canvas canvas)
if (movie != null)
movie.setTime(
(int) SystemClock.uptimeMillis() % movie.duration());
movie.draw(canvas, 0, 0);
invalidate();
【讨论】:
我想从 url 播放..我应该用 url 替换 R.drawable.some_gif 吗?【参考方案3】:我建议使用可以支持 GIF 的第三方库,例如 Glide。
我制作了一个快速示例应用程序,用于显示来自 Giphy 的 API here 的 GIF。
希望有帮助
【讨论】:
【参考方案4】:解决方案的一般草图是使用自定义视图,该视图要求电影定期将自己绘制到画布上。
第一步是构建 Movie 实例。有一个名为 decodeStream 的工厂可以在给定 InputStream 的情况下制作电影,但仅使用来自 UrlConnection 的流是不够的。如果你尝试这个,当电影加载器尝试在流上调用 reset 时,你会得到一个 IOException。不幸的是,黑客使用带有手动设置标记的单独 BufferedInputStream 来告诉它保存足够的数据以使重置不会失败。幸运的是,URLConnection 可以告诉我们需要多少数据。我说这种 hack 很不幸,因为它实际上需要将整个图像缓存在内存中(这对于桌面应用程序来说没有问题,但在内存受限的移动设备上却是一个严重的问题)。
这是电影设置代码的片段:
URL url = new URL(gifSource);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bis.mark(conn.getContentLength());
Movie movie = Movie.decodeStream(bis);
bis.close();
接下来,您需要创建一个显示该影片的视图。带有自定义 onDraw 的 View 子类可以解决问题(假设它可以访问您使用前面的代码创建的 Movie)。
@Override protected void onDraw(Canvas canvas)
if(movie != null)
long now = android.os.SystemClock.uptimeMillis();
int dur = Math.max(movie.duration(), 1); // is it really animated?
int pos = (int)(now % dur);
movie.setTime(pos);
movie.draw(canvas, x, y);
视图不会在没有帮助的情况下触发自身重绘,在 onDraw 结束时盲目调用 invalidate() 只是一种能源浪费。在另一个线程(可能是您用来下载图像数据的线程)中,您可以向主线程发布消息,要求以稳定(但不是疯狂)的速度使视图失效。
Handler handler = new Handler();
new Thread()
@Override public void run()
// ... setup the movie (using the code from above)
// ... create and display the custom view, passing the movie
while(!Thread.currentThread().isInterrupted())
handler.post(new Runnable()
public void run()
view.invalidate();
);
try
Thread.sleep(50); // yields 20 fps
catch (InterruptedException e)
Thread.currentThread().interrupt();
.start();
希望能帮助你理解
【讨论】:
以上是关于如何在 android 中从 url 播放动画 GIF 图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中从 JPEG 创建动画 GIF(开发)
如何在 android 中从 react 本机应用程序播放 mov 视频?