0

我想逐帧播放动画。我有一个 ArrayList byeArr ,其中包含 jpeg 图片并将它们一一解码以显示在表面视图上。

tim = new CountDownTimer(1,1)
{
int i = 0;

@Override
public void onFinish()
{

    if ( i < byeArr.size() )
    {
        bitMap = BitmapFactory.decodeByteArray ( byeArr.get(i) , 0,  byeArr.get(i).length );
            /// bitMap is a bitmap that is displayed on screen.

        lastFrameMs = System.currentTimeMillis() - lastFrameSysTime;
        totalFr = totalFr + lastFrameMs;
        Log.e("LF", "frame: "+ String.valueOf(i) + " = " + String.valueOf(lastFrameMs) +"ms");

        lastFrameSysTime = System.currentTimeMillis();
        i++;
        tim.start();

    }
...

例如,如果我想要一个罕见的 15 FPS 帧,我应该将 CountDownTimer 设置为 1000/ 15 - lastFrameMs ,其中 lastFrameMs 是绘制一帧的时间。

这会很好用,帧将以恒定速度绘制,但问题是它们没有。每帧可能需要 25 到 65 毫秒...

11-14 19:00:52.402: E/LF(26270): frame: 0 = 60ms
11-14 19:00:52.429: E/LF(26270): frame: 1 = 27ms
11-14 19:00:52.488: E/LF(26270): frame: 2 = 55ms
11-14 19:00:52.519: E/LF(26270): frame: 3 = 32ms
11-14 19:00:52.574: E/LF(26270): frame: 4 = 57ms
11-14 19:00:52.605: E/LF(26270): frame: 5 = 30ms
11-14 19:00:52.664: E/LF(26270): frame: 6 = 56ms
11-14 19:00:52.695: E/LF(26270): frame: 7 = 33ms
11-14 19:00:52.753: E/LF(26270): frame: 8 = 58ms
11-14 19:00:52.824: E/LF(26270): frame: 9 = 71ms
11-14 19:00:52.886: E/LF(26270): frame: 10 = 62ms
11-14 19:00:52.914: E/LF(26270): frame: 11 = 27ms
11-14 19:00:52.976: E/LF(26270): frame: 12 = 62ms
11-14 19:00:53.007: E/LF(26270): frame: 13 = 29ms
11-14 19:00:53.066: E/LF(26270): frame: 14 = 61ms
11-14 19:00:53.097: E/LF(26270): frame: 15 = 27ms
11-14 19:00:53.171: E/LF(26270): frame: 16 = 77ms
11-14 19:00:53.199: E/LF(26270): frame: 17 = 28ms
11-14 19:00:53.261: E/LF(26270): frame: 18 = 62ms
11-14 19:00:53.300: E/LF(26270): frame: 19 = 37ms
11-14 19:00:53.355: E/LF(26270): frame: 20 = 56ms
11-14 19:00:53.390: E/LF(26270): frame: 21 = 34ms
11-14 19:00:53.457: E/LF(26270): frame: 22 = 66ms
11-14 19:00:53.484: E/LF(26270): frame: 23 = 30ms
11-14 19:00:53.550: E/LF(26270): frame: 24 = 64ms
11-14 19:00:53.582: E/LF(26270): frame: 25 = 31ms
11-14 19:00:53.640: E/LF(26270): frame: 26 = 60ms
11-14 19:00:53.667: E/LF(26270): frame: 27 = 29ms
11-14 19:00:53.734: E/LF(26270): frame: 28 = 66ms
11-14 19:00:53.769: E/LF(26270): frame: 29 = 33ms
11-14 19:00:53.828: E/LF(26270): frame: 30 = 60ms
11-14 19:00:53.871: E/LF(26270): frame: 31 = 43ms
11-14 19:00:53.929: E/LF(26270): frame: 32 = 58ms
11-14 19:00:53.933: E/- - -(26270):  - - - 
11-14 19:00:53.933: E/fps(26270): 21 FPS
11-14 19:00:53.933: E/avrg ms for frame(26270): 46

...任何想法可以做些什么呢?

谢谢!

4

1 回答 1

2

您不应该在它们被解码后立即显示它们。

在您的计时器中,解码位图,然后在显示位图之前等待 X 时间。X 在哪里

X = constantInterval - lastFrameMs.

如果 X 为负数,则立即绘制。

此外,如果动画足够小,您应该考虑将动画存储在 RAM 中而不是对其进行解码。

于 2012-11-14T19:00:31.337 回答