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

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

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

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

четверг, 15 ноября 2012 г.

Java и месяцы.

К моему ньюфажному удивлению, обнаружил, что Java считает месяцы с нуля. То бишь, ноябрь получается 10-ым месяцем, что принесло мне небольшую попаболь.

среда, 14 ноября 2012 г.

Реальный размер Bitmap

     Столкнулся с одной интересной особенностью: размеры Bitmap при вызове getWidth() и getHeight() возвращаются реальные, т.е. сколько пикселей само изображение, загруженное под соответствующее DPI. Однако выводится, например, на Canvas при drawBitmap масштабированное изображение под соответствующий density. Таким образом, правильней писать в некоторых случаях так:

int height,width;
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.resource_name);
height = bmp.getScaledHeight(bmp.getDensity());
width = bmp.getScaledWidth(bmp.getDensity());

Соответственно, можно вместо density самого Bitmap-а брать DPI, например, всего экрана через DisplayMetrics и т.д.
Такой вот простенький трик. Возможно, говорю о крайне банальных вещах, но я дошел до этого не сразу.