2013-10-09 37 views
0

我實現了像描畫的組件方式如下:優化定製的作物拉

@Override 
protected void onDraw(Canvas canvas) { 
    int w = canvas.getWidth(); 
    int h = canvas.getHeight(); 

    if (mFinalBitmap == null) { 
     mFinalBitmap = Bitmap.createBitmap(w, h, 
       Bitmap.Config.ARGB_8888); 
    } 

    if (mTempCanvas == null) { 
     mTempCanvas = new Canvas(mFinalBitmap); 
    } 

    if (mBackgroundBitmap == null) { 
     mBackgroundBitmap = createBitmap(R.drawable.rounded_background, 
       w, h); 
    } 

    if (mBackgroundImage == null) { 
     mBackgroundImage = createBitmap(R.drawable.image_for_background, w, h); 
    } 

    mTempCanvas.drawBitmap(mBackgroundBitmap, 0, 0, null); 
    mTempCanvas.drawBitmap(mBackgroundImage, 0, 0, mPaint); 

    canvas.drawBitmap(mFinalBitmap, 0, 0, null); 
} 

private Bitmap createBitmap(int id, int width, int height) { 

    Bitmap bitmap = BitmapFactory.decodeResource(getContext() 
      .getResources(), id); 

    return Bitmap.createScaledBitmap(bitmap, width, height, false); 
} 

凡mPaint有

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 

enter image description here

我想知道的代碼是否好,或者可以針對相同的結果進行優化,它使用很多內存,並且是潛在的觸發器,用於OutOfMemoryError

謝謝。

+0

看一看[幀屏蔽(作物)圖像(http://stackoverflow.com/q/12614542/593709) –

+0

代碼幾乎是一樣的存在,位圖創建,臨時帆布其中很多的使用ARGB_888來繪製結果位圖,使其變得沉重。這真的是最好的解決方案嗎? – Niko

回答

1

以下繪圖可以使用BitmapShader來實現,並且要繪製圖像,那麼我只需要創建ALPHA_8 Bitmap以使用着色器繪製Paint對象。但是着色器被固定到窗口座標中,因此在滾動組件內使用此方法可能會導致一些問題,因爲需要正確轉換Matrix

// Create bitmap shader 
if (mShaderBitmap == null) { 
    mShaderBitmap = use wanted bitmap here. 
    BitmapShader shader = new BitmapShader(mShaderBitmap, 
      TileMode.CLAMP, TileMode.CLAMP); 
    mPaint.setShader(shader); 
} 

// Create alpha bitmap to draw with shader paint 
if (mBitmapToDraw == null) { 
    mBitmapToDraw = load the shape here with ALPHA_8 Config 
} 

canvas.drawBitmap(mBitmapToDraw, 0, 0, mPaint); 
+0

如何「正確翻譯矩陣」?我在自定義可繪製中使用這種方法,但它不適用於Android 4.0+,它始終固定在窗口左上角(0,0),而不是我的視圖!但我已經在2.3.3上測試過了,它工作正常!?!? – d370urn3ur