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));

ここに画像の説明を入力

コードが良いのか、それとも同じ結果を得るために最適化できるのか疑問に思っています。大量のメモリを使用し、OutOfMemoryError.

ありがとう。

4

1 に答える 1

1

描画する画像を使用して次の描画を実現できます。あとはシェーダーを使用してオブジェクトで描画BitmapShaderするための ALPHA_8 を作成するだけです。ただし、シェーダーはウィンドウ座標に固定されているため、スクロール コンポーネント内でこのメソッドを使用すると、適切に変換する必要があるため、問題が発生する可能性があります。BitmapPaintMatrix

// 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);
于 2013-12-04T09:53:30.870 に答える