2013-01-10 31 views
7

我正在使用viewpager在我的應用程序中的片段之間滑動。我在XML中定義了背景,所以如果我使用簡單的背景顏色,我的應用程序工作非常流暢。如果我在這個背景圖片中使用它,fps會減少,我的應用程序只能通過。這並不慢,只是不那麼順利,但是在較弱的設備上它可能會工作滯後。這是應用背景圖像的不好方法嗎?整個圖像是一個尺寸爲14.7kB的480x800 PNG。可能是什麼問題?android背景圖像放慢應用程序

(該片段的背景是透明的,則viewpager是在具有其與該圖像一個背景main.xml中)

+0

你能上傳背景圖片?如果它們是黑色陰影,可以使用Photoshop將它們刪除,然後將其手動添加到xml文件中。或者任何其他重複的顏色。 –

回答

1

這樣做的原因可能是該圖像被拉伸,和Android具有性能拉伸背景圖像的問題。

取而代之,您應該用背景顏色或see this answer替換背景圖像以使圖像重複,而不是拉伸。

9

有很多答案指出預縮放位圖。這是非常重要的,如果可以的話,你應該這樣做,但是在嘗試了幾個不同的事情之後,我所經歷的最大性能增益是創建視圖並覆蓋onDraw方法。

類可能是這樣簡單:

public class DTImageView extends View { 

    public Bitmap imageBitmap; 

    public DTImageView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     if(imageBitmap != null) 
      canvas.drawBitmap(imageBitmap, 0, 0, null); 
    } 
} 

使用預分位圖調用代碼:

DTImageView bgImageView = new DTImageView(context); 
bgImageView.imageBitmap = Bitmap.createScaledBitmap(bitmap,width,height,true); 

在這一點上,你可以它屬於這個視圖添加到視圖層次結構。在我的情況下,我的視圖層次結構有一個bgImage,其中發生了所有其他功能的中間層,以及fgImage。

使用android sdk工具Hierarchy Viewer來分析應用程序並查看每個視圖繪製的速度。我的應用花了30-40毫秒繪製bgImage和fgImage。預縮放和覆蓋onDraw減少了30-40毫秒到約1.5毫秒。

這裏是我的觀點一個繪圖性能的截圖前後:

BEFORE: Using setImageBitmap instead of overriding onDraw.

AFTER: Using the above DTImageView which simply overrides OnDraw

1

我有同樣的問題我用這種方法解決了它:

將您的圖像添加到位於res目錄下的mipmap文件夾。它會根據它的密度添加圖像。

6

我有點晚,但這只是我,並且在運行GPU調試器時,我注意到系統放大了我的圖像!我有一個1920x1080的圖像,它顯示爲3780x6720紋理!

理想情況下,您應該爲相應文件夾中的每個密度設置紋理(res/drawable-mdpi,res/drawable-hdpi等)。

但是,如果您認爲您的一個紋理很好,請將其放入res/drawable-nodpi,而不是res/drawable。如果您將其放入res/drawable-nodpi,系統將不會根據dpi進行擴展。

就我而言,它將Pixel XL上的10fps的簡單UI更改爲60fps的全幀率。

3

我有一個背景圖像,尺寸不大,但具有奇怪的尺寸 - 因此拉伸性能差。我使用參數Context,一個View和一個可繪製的ID(int)來創建一個與設備屏幕大小相匹配的方法。例如在片段onCreateView中使用此設置來設置背景。

public void setBackground(Context context, View view, int drawableId){ 
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableId); 
    int width = Resources.getSystem().getDisplayMetrics().widthPixels; 
    int height = Resources.getSystem().getDisplayMetrics().heightPixels; 
    bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); 
    BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bitmap); 
    view.setBackground(bitmapDrawable); 
} 
+0

這對我很好! –

0

創建大小爲1080×1920只添加一個背景圖像,並把它放在繪製-nodpi文件夾和解決了這個問題