2014-11-03 3 views
0

Я интегрирую giphy в свое приложение для Android.Как играть в анимированное GIF-изображение с url в android?

Как я могу играть в animated gif изображение из URL-адреса в андроиде? Должен ли я использовать ImageView, WebView, VideoView и т. Д.? Например, если я хочу воспроизвести анимацию с адреса this.

+0

http://stackoverflow.com/questions/3660209/display-animated-gif –

+0

http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html – Naufal

+0

Если вы сделали R & D, тогда вы могли бы его найти. http://gayashan-a.blogspot.in/2012/02/android-how-to-display-gif-image-in.html, http://android-er.blogspot.in/2014/03/load- animated-gif-from-internet.html, http://androidsurya.blogspot.in/2014/03/how-to-load-animated-.gif-from-internet-programmatically-in-android-example-howtoto -show-gif-images-in-android.html – Piyush

ответ

2

Просто создайте строку html и загрузите ее в веб-представление Android. Протестировано решение.

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"); 
+0

этот путь я должен положить URL внутри строки х = « http://giphy.com/gifs/funny-cat-DFiwMapItOTh6» –

+0

Может у PLZZ написать то, что я должен поместить в строку x..the код у дал выше, не имеет тела, начиная тег, но имеет конечную метку тела? и IMG тег? thanku ур времени ... –

+0

@ user3753273 проверка Теперь – Javanator

1

Попробуйте этот путь

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(); 
     } 
    } 
+0

Я хочу играть с url..может ли я заменить R.drawable.some_gif на url? –

0

Общий эскиз решения заключается в использовании трудоустроить пользовательский вид, который всасывает спрашивает фильм, чтобы периодически рисовать себя на холсте.

Первый шаг - создание экземпляра фильма. Существует фабрика называется decodeStream, которая может сделать фильм с учетом InputStream, но недостаточно использовать поток из UrlConnection. Если вы попробуете это, вы получите IOException, когда загрузчик фильма попытается вызвать сброс в потоке. Хэком, к сожалению, является использование отдельного BufferedInputStream с меткой, заданной вручную, чтобы сообщить ему, чтобы сохранить достаточно данных, сброс которых не завершится. К счастью, URLConnection может рассказать нам, сколько данных ожидать. Я говорю, что этот взлом неудачен, потому что он эффективно требует, чтобы весь образ буферизировался в памяти (что не представляет проблемы для настольных приложений, но это серьезная проблема на мобильном устройстве с ограниченным объемом памяти).

Вот надрез кода настройки фильма:

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(); 

Далее, вам нужно создать представление, которое будет отображать этот фильм. Подкласс View с пользовательским onDraw выполнит трюк (если у него есть доступ к 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 это просто энергия отходов. В другом потоке (возможно, тот, который вы использовали для загрузки данных изображения) вы можете публиковать сообщения в основном потоке, прося, чтобы представление было недействительным с устойчивым (но не безумным) темпом.

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(); 

надеюсь, что это поможет вам понять

1

Я бы рекомендовал использовать сторонние библиотеки, как Glide, которая может поддерживать GIFs.

Я сделал примерный пример приложения для отображения GIF из API-интерфейса Giphy here.

Надежда, что помогает

 Смежные вопросы

  • Нет связанных вопросов^_^