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으로 변환하고 안드로이드가 아이들을 측정하여 상대 레이아웃 규칙을 존중할 수 있다는 것입니다.
나를 해결할 수있는 사람에게 많은 감사드립니다.
롭
우수. Romain 감사합니다. 나는 그것이 measure()와 layout()과 관련이 있다는 것을 알고 있었지만, 모든 것을 묶는 방법을 찾지 못했습니다. 다시 한번 감사드립니다. –
나를 위해 일했습니다. 감사! – Doigen
나를 위해 일했습니다. 고마워 .. –