我正在将 giphy 集成到我的 android 应用程序中。
我如何animated gif
在 android 中播放来自 URL 的图像?我应该使用ImageView, WebView, VideoView
等吗?例如,如果我想从这个URL 播放动画。
只需创建一个 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");
Try this way
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();
}
}
解决方案的一般草图是使用自定义视图,该视图要求电影定期将自己绘制到画布上。
第一步是构建 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();
希望它能帮助你理解