2011-02-10 18 views
12

Bir ViewGroup (RelativeLayout) dosyasını bir Tuval kullanarak Bitmap'e başarıyla dönüştürüyorum. Ne var ki, beraberlik olduğunda, sadece ViewGroup'ı arka planını çizilebilir görüyorum, ancak FILL_PARENT gibi kuralları kullanarak RelativeLayout içinde yer alması gereken çocuklarını (iki TextViews) değil.Android Sorunları ViewGroup'u Çocuklarla Bitmap'e Dönüştürme

RelativeLayout aşağıdaki statik fonksiyonu kullanılarak oluşturulur: Beklendiği gibi bu bana güzel bir Bitmap verir

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

:

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

Sonra bir bitmap içine RelativeLayout açmak için aşağıdaki kullanmak arka plan ile ihtiyaç duyduğum boyutlar çekilebilir, ancak çocuklar bitmapte değiller. Bu işlevleri, faaliyetlerimde özel bir görünüme çizilen büyük bir görüntü oluşturmak için oldukça fazla derim.() Fonksiyonu

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

Benim özel görünüm onDraw'u geçersiz kılar: Ben Android olmaz, çünkü bu olduğuna inanıyoruz Görebildiğimiz kadarıyla

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

Bu

statik işlev çağrıları döngü Çocuk Görünümlerinde bir ölçü() çağırmayın. Bunu el ile aramayı denedim, ancak bu sorunu çözmüyor.

Yani, bilmek istediğim, bir RelativeLayout'u çocuklarla bir Bitmap'e dönüştürme işlemini nasıl gerçekleştirebilirim ve Android'i, çocukların göreli düzen kurallarına uymaları için ölçmeleri için Android'i nasıl elde edebilirim.

Bunun için bana yardımcı olabilecek herkese çok teşekkürler.

Rob

cevap

22

sorun ölçüp kabı düzeni yoktu olmasıdır. Çizim yapmadan önce v.measure(widthSpec, heightSpec) ve v.layout(left, top, right, bottom) numaralı telefonu aramanız gerekir. İlk yöntem, görüntünün ne kadar büyük olmasını istediğinizden emin olmasını sağlar ve ikinci yöntem, çocukların doğru şekilde konumlandırılmasını sağlayacaktır.

Durumda da yapacağını: Düzenleri yanı yararlı olabilir için DisplayMetrics dayalı

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

Mükemmel. Çok teşekkürler Romain! Ölçü() ve layout() ile ilgili bir şey olduğunu biliyordum, ama hepsini nasıl bağlayacağımı bilemedim. Tekrar teşekkürler. –

+0

Benim için de çalıştı. Teşekkürler! – Doigen

+0

Benim için de çalıştı. Teşekkürler .. –