вторник, 20 ноября 2012 г.

Анимация gif на SurfaceView

   Итак, пару дней промучался с корректным отображением анимации. В итоге сделал класс, расширяющий SurfaceView, в который засовывал Gif из ресурсов, чужой библиотечкой разбирал gif на Bitmap покадрово, при инициализации считал нужный шаг на основе FPS и общего времени гифа с дистанцией, до конечной точки.
   Столкнулся с проблемой странной работы SurfaceView и onDraw. Странно потому, что так ничего и не понял: при invalidate(), postInvalidate() и иже с ними, onDraw не вызывается. В интернетах нашлось пару способов, как исправить ситуацию при помощи метода setWillNotDraw. Собственно, как все это связано, я так и не понял. Опыта, знаете ли, маловато. Так что, сделал все в "функции-помощнике", последовательно вызывающей в потоке lockCanvas, onDraw и unlockCanvasAndPost. Работает, вроде, все неплохо)
   Благодаря такому подходу, в onDraw считаю все модификации с Canvas, а смена кадров gif-а идет как бы отдельно от основной отрисовки. Вообщем, именно то, что мне было нужно! Ура!

   В итоге на экране летит анимированная gif-ка. Я улыбаюсь. Я радуюсь. Я - идиот.