2012-04-12 144 views
1

將動畫顯示爲動態壁紙的最佳方式是什麼?現在我有一個GIF分成11個png格式(每幀),然後我只是在做Android動態壁紙動畫

public Bitmap frame0; 
ArrayList<Bitmap> frameArray = new ArrayList<Bitmap>(); 
frame0 = BitmapFactory.decodeResource(getResources(), R.drawable.nyancat0); 
frame0 = Bitmap.createScaledBitmap(frame0, minWidth, minHeight, true); 
frameArray.add(frame0); 

然後,我只是通過幀使用for循環中循環,並吸引他們在畫布上

canvas.drawBitmap(frameArray.get(indexnumber), 0, 0, mPaint); 

然後我只是改變我的索引號++,除非它是11,然後我回到1. 這是有效的,但是當然,存儲很多Bitmap是非常低效的內存。這阻止了我做多層或其他很酷的效果,沒有滯後和電池消耗。有沒有更好的方式在Android動態壁紙上顯示動畫?我試過電影顯示整個GIF,但不支持動態壁紙。

回答

1

加載圖像需要多長時間?如果它可以忽略不計,那麼爲什麼不顯示它之前加載每個圖像,丟棄舊圖像?這樣,你在任何一個階段只有1張圖像在內存中。

或者做一些類似於使用後臺緩衝區的東西,在內存中有兩個空格,一個用於現在顯示的圖像,另一個用於加載下一個圖像。當需要更改時,使新加載的位圖可見,卸載另一個,然後將下一幀加載到該位置。

+0

我會試一試,讓你知道它是怎麼回事!現在你提到它非常簡單 – NightmareApps 2012-04-13 00:00:52

0

儘管人們說,你實際上可以在你的動態壁紙中有很多圖像。唯一棘手的是內存限制。我的應用程序中裝載了40個.png,我在一分鐘內重新加載了一次。

但是,當你在你的應用程序處理很多圖片,你必須加載它們在一個巧妙的方法:

public BitmapResult decodeResource(int file, int scale){ 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inPurgeable = true; 
     o.inInputShareable = true; 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(resources, file, o); 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     o2.inSampleSize=scale; 
     return new BitmapResult(BitmapFactory.decodeResource(resources, file, o2),o2.outWidth,o2.outHeight); 
} 

你看到規模變量?它應該是2的冪,它縮放你的位圖。

如果事情變得不對勁,清潔位圖,並用低質量的重載位圖:

void init() 
{ 
    try 
    { 
     loadFirstBitmap(); 
     loadSecondBitmap(); 
    } 
    catch(java.lang.OutOfMemoryError error) 
    { 
     /*some infinite loop breaker*/ 
     scale *= 2; 
     cleanup(); 
     init(); 
    } 
} 

此外,系統將無法擺脫的位圖你的,你必須自己清理他們,然後可能跟垃圾收集器:

bitmap1.recycle(); 
bitmap2.recycle(); 
System.gc(); 

調整您的位圖到你需要的是也是一個好主意大小,否則系統可能會調用createScaledBitmap您嘗試繪製這將需要額外的內存各一次。

我從來沒有想過這種類型的應用程序的內存上限是什麼,它是最常見的24 MB的內存堆限制,但我可以告訴你,我的應用程序需要高達13 MB的內存,沒有人曾報告Android設備崩潰> = 2.2。

因此,如果您遵循一些優化規則,則可以根據需要在應用程序中加載儘可能多的位圖。