2011-10-10 60 views
3
的setImageBitmap

長時間讀者後的時間在onmeasure方法,第一次提問者所以請輕輕;)爲了ImageView的

我有一個顯示約10張照片第二上ImageView的一個Android代碼。 (在ImageView上調用setImageBitmap來設置新的位圖) 這會導致顯示滯後,所以我試圖儘可能地加快速度。

我發現(與traceview)該應用程序花了很多時間上的方法:

ViewRoot.performTraversals 
View.measure 
FrameLayout.onmeasure 
ViewGrou.measureChildWithMargins 

我懷疑在ImageView的測量,所以我有創造CustomImageView並在此改變onMeasure只是調用超級方法和寫入系統輸出。

似乎每次setImageBitmap onmeasure被調用3次之後。 位圖相同大小,所以沒有變化。實際上,當圖像源發生改變時,它可能會不時發生變化,但只能在此時重新測量。

什麼可以改變,覆蓋,做到消除這種測量對應用速度的影響?

如果您需要更多信息,請告訴我,我會提供。

示例代碼,我改變

final Bitmap bitmapScaled = Bitmap.createScaledBitmap(bitmap2, width, height, false); 
imageView2.setScaleType(ScaleType.CENTER_INSIDE); 
if (setSize) { 
    setSize(imageView2, width, height); 
} 
imageView2.setImageBitmap(bitmapScaled); 

方法,使其工作速度(可能不是安全的?!)

boolean layout=true; 

int noL=1; 

@Override 
public void requestLayout() { 
    if (layout){ 
     super.requestLayout();    
     if (noL>10){ 
      layout=false; 
     }else{ 
      noL++; 
     } 
    } 
} 
+0

如何使您的代碼片段使我們能夠複製和幫助您解決問題?這似乎不是一個明顯的問題,任何人都可以在沒有代碼上下文的情況下跳入。 – momo

+0

Snippent不會改變匹配,因爲問題在於經常只做一行setImageBitmap。我有點解決它與自定義圖像視圖和重寫requestlayout方法。我改變了這個方法,所以它會調用超10次,不再有效,它可以工作並節省大量時間。仍然有適當的解決方案,因爲我不確定這是否會讓我頭痛到別的地方。 –

+0

基本上只是用隨機圖片做setImageBitmap 10次,看看如何提高延遲?我只是因爲10張圖片沒什麼影響而感到驚訝。這就是爲什麼我要求代碼片斷來查看是否有其他問題導致這一問題。作爲一個長期的讀者,你應該知道代碼片段如何幫助任何人回答一個特定的問題並更好地理解上下文 – momo

回答

6

當我有一個類似的問題,我做了以下內容:

public class ImageViewEx extends ImageView{ 
    private boolean makeRequest; 
    public ImageViewEx(Context context){ 
     super(context);makeRequest=true; 
    } 
    public ImageViewEx(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 
    public ImageViewEx(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     makeRequest=true; 
    } 
    public void setImageBitmapNoRequestLayout(Bitmap bitmap) { 
     makeRequest = false; 
     setImageBitmap(bitmap); 
     makeRequest = true; 
    } 
    @Override public void requestLayout(){ 
     if(makeRequest)super.requestLayout(); 
    } 
} 

現在更改位圖setImageBitmapNoRequestLayout(...)不會調用requestLayout()