2011-02-10 7 views
12

ViewGroup(RelativeLayout)をCanvasを使用してビットマップに変換しています。しかし、描画が発生したとき、私は、その背景描画可能なViewGroupと、FILL_PARENTのようなルールを使ってRelativeLayout内にレイアウトされるべき子(2つのTextViews)ではなく、ViewGroupを見るだけです。Androidの問題子供とビューグループをビットマップに変換する

RelativeLayoutは、次の静的関数を使用して作成されます。予想したように、これは私での素敵なビットマップを与える

public static Bitmap loadBitmapFromView(RelativeLayout v) { 
    Bitmap b = Bitmap.createBitmap(v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.RGB_565); 
    Canvas c = new Canvas(b); 
    v.draw(c); 
    return b; 
} 

:私は、次のビットマップにRelativeLayoutを回すために使用

public static RelativeLayout createProgrammeView(Context context, int width, int height, String title, String time) { 
    RelativeLayout.LayoutParams params; 

    // Layout Root View (RelativeLayout) 
    RelativeLayout rlv = new RelativeLayout(context); 
    params = new RelativeLayout.LayoutParams(width, height); 
    rlv.setLayoutParams(params); 
    rlv.setPadding(3, 3, 3, 3); 
    rlv.setBackgroundResource(R.drawable.background); 

    // Layout Title 
    TextView tv = new TextView(context); 
    params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
    tv.setId(R.id.title); 
    tv.setLayoutParams(params); 
    tv.setGravity(Gravity.CENTER_VERTICAL); 
    tv.setSingleLine(true); 
    tv.setEllipsize(TruncateAt.END); 
    tv.setTextColor(Color.parseColor("#fff")); 
    tv.setTextSize(11); 
    tv.setText(title); 
    rlv.addView(tv); 

    // Layout Start Time 
    tv = new TextView(context); 
    params = new RelativeLayout.LayoutParams(16, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    params.addRule(RelativeLayout.BELOW, R.id.title); 
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
    params.setMargins(0, 4, 0, 0); 
    tv.setId(R.id.time); 
    tv.setLayoutParams(params); 
    tv.setGravity(Gravity.CENTER_VERTICAL); 
    tv.setSingleLine(true); 
    tv.setEllipsize(null); 
    tv.setTextColor(Color.parseColor("#fff")); 
    tv.setTextSize(10); 
    tv.setText(time); 
    rlv.addView(tv); 
    } 

    return rlv; 
} 

を背景drawableで必要な次元ですが、子はビットマップにありません。これらの関数をかなりたくさん呼び出すことで大きな画像を作成し、それを自分のアクティビティのカスタムビューに描画します。

これは、静的な関数を呼び出すループである:私はこれが原因のAndroidのdoesnであると考えて見ることができるものから

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawBitmap(largeBitmap, 0, 0, null); 
} 

public static void renderViews(final Context context) { 
    largeBitmap = Bitmap.createBitmap(largeWidth, largeHeight, Bitmap.Config.RGB_565); 
    Canvas largeCanvas = new Canvas(largeBitmap); 

    for (int i = 0; i < items.size(); i++) { 
     int leftMargin = ...SOME CALCULATIONS...; 

     RelativeLayout newView = createProgrammeView(context, width, rowHeight, "Title", "21:00"); 
     Bitmap newViewBitmap = loadBitmapFromView(newView); 

     largeCanvas.drawBitmap(newViewBitmap, leftMargin, 0, new Paint()); 
    } 

    myCustomView.invalidate(); 
} 

マイカスタムビューは、onDraw()関数をオーバーライドします子ビューでmeasure()を呼び出しません。私はこれを手動で呼び出すことを試みたが、これは問題を解決しない。

私は、子どもと一緒にRelativeLayoutをBitmapに変換し、相対レイアウトルールを尊重するために子供を測定するためにAndroidを取得する方法を知りたいと思います。

私はこれを解決する手助けをすることができます誰もに感謝します。

ロブ

答えて

22

問題は、あなたが測定し、コンテナをレイアウトしていないということです。図面が機能するには、v.measure(widthSpec, heightSpec)に電話をしてからv.layout(left, top, right, bottom)に電話する必要があります。最初の方法は、あなたが望む大きさをビューが知っていることを確認し、2番目の方法は子供が適切に配置されるようにします。あなたはどうしたらあなたの場合

:レイアウトのためDisplayMetricsに基づいて

v.measure(MeasureSpec.makeMeasureSpec(v.getLayoutParams().width, MeasureSpec.EXACTLY), 
     MeasureSpec.makeMeasureSpec(v.getLayoutParams().height, MeasureSpec.EXACTLY)); 
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 

Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.RGB_565); 
Canvas c = new Canvas(b); 
v.draw(c); 
+0

優れています。本当にありがとうロメイン!私はそれがmeasure()とlayout()と関係があることを知っていましたが、それをすべて結びつける仕組みはできませんでした。再度、感謝します。 –

+0

私のために働いた。ありがとう! – Doigen

+0

私のために働いた。ありがとう.. –

0

ソリューションは、同様に有用である可能性があります。繰り返さないように - look here

関連する問題