2011-02-10 12 views
12

में बच्चों के साथ व्यू ग्रुप को कनवर्ट करना मैं कैनवास का उपयोग करके बिटकमैप में एक व्यू ग्रुप (सापेक्ष लेटआउट) को सफलतापूर्वक परिवर्तित कर रहा हूं। हालांकि, जब ड्रॉ होता है तो मैं केवल अपनी पृष्ठभूमि के साथ व्यूग्रुप को देखता हूं, न कि इसके बच्चे (दो टेक्स्ट व्यू) जिन्हें FILL_PARENT जैसे नियमों का उपयोग करके रिलेवेटिवआउट के भीतर रखा जाना चाहिए।एंड्रॉइड समस्याएं बिटकमैप

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 चालू करने के लिए उपयोग करें पृष्ठभूमि के साथ आवश्यक आयामों को आकर्षित करने योग्य, लेकिन बच्चे बिटमैप में नहीं हैं। मैं इन कार्यों को एक बड़ी छवि बनाने के लिए काफी कुछ कहता हूं जो तब मेरी गतिविधि में एक कस्टम दृश्य पर खींचा जाता है।

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 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawBitmap(largeBitmap, 0, 0, null); 
} 

मैं क्या देख सकते हैं मेरा मानना ​​है कि इस वजह से एंड्रॉयड नहीं करता है से

इस पाश जो स्थिर फ़ंक्शन को कॉल है बच्चे के दृश्यों पर एक उपाय() को कॉल न करें। मैंने इसे मैन्युअल रूप से कॉल करने का प्रयास किया है, लेकिन इससे समस्या हल नहीं होती है।

तो, मुझे लगता है कि मैं क्या जानना चाहता हूं, मैं बच्चों के साथ रिश्तेदार लयआउट को बिटमैप में कैसे परिवर्तित कर सकता हूं और बच्चों को मापने के लिए एंड्रॉइड प्राप्त कर सकता हूं ताकि वे अपने सापेक्ष लेआउट नियमों का सम्मान कर सकें।

किसी को भी बहुत धन्यवाद जो मुझे यह काम करने में मदद कर सकता है।

रोब

उत्तर

22

समस्या यह है कि आप इसका आकलन नहीं किया था और कंटेनर लेआउट है। ड्राइंग करने से पहले आपको v.measure(widthSpec, heightSpec) और फिर v.layout(left, top, right, bottom) पर कॉल करना होगा। पहली विधि यह सुनिश्चित करेगी कि दृश्य जानता है कि आप कितना बड़ा होना चाहते हैं, और दूसरी विधि यह सुनिश्चित करेगी कि बच्चे ठीक से स्थित हों।

आपके मामले में आप क्या करेंगे:

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

उत्कृष्ट। बहुत बहुत धन्यवाद रोमैन! मुझे पता था कि यह माप() और लेआउट() के साथ कुछ करने के लिए था, लेकिन मैं बस यह सब काम करने के लिए काम नहीं कर सका। एक बार फिर धन्यवाद। –

+0

मेरे लिए भी काम किया। धन्यवाद! – Doigen

+0

मेरे लिए भी काम किया। धन्यवाद .. –

0

समाधान है कि DisplayMetrics के आधार पर लेआउट के साथ-साथ उपयोगी हो सकता है के लिए। दोहराने के क्रम में - look here

संबंधित मुद्दे