2010-02-18 43 views
1

我创建了一个在ImageView中显示大约250个图像的应用程序。图像一个接一个地加载,每秒15-30幅图像。基本上整个事情给出了旋转3D对象的幻觉,至少它应该。 问题是接下来,加载某些图像(即我看到流畅的动画效果的几秒钟,然后动画挂起,跳10-15帧(图像)时,提前挂起应用程序和继续,它总是发生在动画周期同一个地方。 我认为,虽然Android的可能没有足够的资源来处理这样的事情,所以我调整图像一半大小,但我以前不帮助。我已经试过缓存图像但我以前不帮助任何(实际上,我认为动画看起来有点平滑) 现在是最奇怪的事情,我使用触摸屏让用户“旋转”这些图像上的3D对象,并在旋转的同时再次体验那些挂在与动画完全一样的地方Android加载并在ImageView中显示大量图像(逐帧动画)在特定时刻挂起

所有图像都是.png格式,其大小从15kB到40kB。

我用下面的代码为动画:

new Thread(new Runnable() { 

    @Override 
    public void run() { 
    while (!stopStartupAnimation && li < images_360.length) { 
    final int fli = li; 
    handler.post(new Runnable() { 

     @Override 
     public void run() { 
     //Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
     //imageCanvas.setImageResource(images_360[fli]); 
     imageCanvas.setImageBitmap(imageStackNext.pop()); 
     System.out.println("rawX = " + fli); 
     } 
    }); 
    int ti = fli +25; 
    if(ti > images_360.length-1){ 
     ti = ti - images_360.length; 
    } 
    imageStackNext.push(BitmapFactory.decodeResource(getResources(), images_360[ti])); 
    synchronized (this) { 
     try { 
     wait(1000/25); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
    } 
    li++; 
    li++; 
    if (li >= images_360.length) { 
     li = 0; 
    } 
    } 
    } 
    }).start(); 

回答

1

首先,15-40KB是他们的压缩形式。未压缩,如Bitmaps,它们可能大得多。其中250个可能会使用多MB的RAM,这不是一个好主意。其次,如果在使用OpenGL for 3D(这是其目的)或者使用Canvas上的2D绘图基元或使用ImageView之间进行选择,那么您选择了性能最差的选项。

第三,postRunnable()不立即生效,而是将事情放在主应用程序线程的消息队列中,以便在有机会时进行处理。如果它被捆绑起来 - 说,处理触摸事件 - 它可能跳过一些看似多余的ImageView重绘,或让他们这么快,他们似乎不会发生走。你所有的40ms wait()确实是确保你每40ms只举一个事件,而不是他们每隔40ms就会油漆。此外,你可以更容易地使用postDelayed()为你的40毫秒计时。

+0

图像并非一次全部加载,而是逐个加载。你对OpenGL的看法是正确的,但是将它用于这个应用程序会是一个矫枉过正的问题,因为我是动画的对象不是一个多维数据集或简单的东西,再加上它不仅仅是这个对象。 我知道postRunnable()不会立即生效,我试图用postDelayed(),但它会产生同样的效果。 – Milan 2010-02-19 00:11:02

+0

此外,我已经写道,我已经尝试将图像大小调整为其大小的一半,并且它没有帮助。我一直没能说的是,当我使用触摸屏旋转3D对象(通过滑动触摸屏)不,如果我通过360' 或10' 挂起仍然存在正好旋转它没关系它们在动画中发生的位置相同。 – Milan 2010-02-19 00:11:45

+0

“你说得对OpenGL的,但使用它为这个应用程序将是矫枉过正,因为对象我动画是不是一个立方体或简单的东西”那么,你的思维方式,以有效地实现一个不简单的3D动画是避免使用3D硬件加速技术并使用性能较差的替代方案? “我知道postRunnable()不会立即生效,我试图使用postDelayed(),但它产生相同的效果。”当然,它会 - 他们都将事件放在主线程队列中。这在使用小部件时是不可避免的,这就是为什么3D动画不应该使用小部件。 – CommonsWare 2010-02-19 01:15:00