2011-02-10 3 views
12

Canvas를 사용하여 ViewGroup (RelativeLayout)을 비트 맵으로 변환하는 중입니다. 그러나 그리기가 발생하면 필자는 Background Drawable을 가진 ViewGroup 만 볼 수 있으며 자식 (두 개의 TextViews)은 FILL_PARENT와 같은 규칙을 사용하여 RelativeLayout 내에 배치해야합니다.안드로이드 문제 어린이와 함께 ViewGroup을 비트 맵으로 변환

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

:

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

내가 다음 비트 맵으로 RelativeLayout의를하려면 다음을 사용하십시오 배경 drawable에 필요한 치수는 있지만 비트 맵에는 자식이 없습니다. 필자는 이러한 기능을 꽤 많이 호출하여 큰 이미지를 작성한 다음 내 활동의 사용자 정의보기에 그려줍니다.() 함수

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를 오버라이드 (override) : 나는 안드로이드 아무튼 때문이다 믿고 볼 수있는에서

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

정적 함수를 호출 루프입니다 아이 뷰에 measure()를 호출하지 않습니다. 이 호출을 수동으로 시도했지만이 문제가 해결되지 않습니다.

그래서 내가 알고 싶은 것은 아이들과 함께 RelativeLayout을 Bitmap으로 변환하고 안드로이드가 아이들을 측정하여 상대 레이아웃 규칙을 존중할 수 있다는 것입니다.

나를 해결할 수있는 사람에게 많은 감사드립니다.

답변

22

문제는 당신이 측정하고 컨테이너를 레이아웃하지 않았다 것입니다. 그림을 그리기 전에 v.measure(widthSpec, heightSpec)v.layout(left, top, right, bottom)에 전화해야합니다. 첫 번째 방법은보기가 얼마나 큰지 알고 있는지 확인하고 두 번째 방법은 자녀가 제대로 배치되도록합니다.

는 귀하의 경우에는 당신이 할 것 : 레이아웃뿐만 아니라 유용 할 수에 대한 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

우수. Romain 감사합니다. 나는 그것이 measure()와 layout()과 관련이 있다는 것을 알고 있었지만, 모든 것을 묶는 방법을 찾지 못했습니다. 다시 한번 감사드립니다. –

+0

나를 위해 일했습니다. 감사! – Doigen

+0

나를 위해 일했습니다. 고마워 .. –