Android: Как делают дисплей, большое анимировало gif, учитывая URL?

Я решил это. Это была проблема устаревшего удаленного сервера с докером. Теперь, когда я работаю с новой версией (3.141.59), она работает нормально:

docker run -d -p 4445:4444 selenium/standalone-firefox:3.141.59-iron
15
задан Janusz 2 July 2010 в 06:49
поделиться

2 ответа

Общий набросок решения заключается в использовании пользовательского Представления , который запрашивает Фильм , чтобы нарисовать себя на Canvas ] периодически.

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

Вот фрагмент код установки Movie :

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

Затем вам нужно создать представление, которое будет отображать этот Movie . Подкласс 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);
    }
}

view не запускается для перерисовки без посторонней помощи, а слепой вызов invalidate () в конце onDraw - это просто трата энергии.

12
ответ дан 1 December 2019 в 04:34
поделиться

Вы пробовали BitmapDecode ?

Здесь есть пример в демоверсиях API здесь .

1
ответ дан 1 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: