2012-02-15 10 views
6

समस्या विवरण:
मैंने एक दृश्य से बिटमैप स्नैफॉट बनाने के लिए निम्नलिखित दो विधियों का परीक्षण किया है (उदाहरण के लिए इस मामले में एक सापेक्ष लयआउट)। दोनों विधियां दृश्यों के लिए उत्कृष्ट कार्य करती हैं जो आयाम (उदा। चौड़ाई और ऊंचाई) डिवाइस स्क्रीन के आयामों से कम हैं (उदा। 480x900)। दृश्य का दृश्य भाग पकड़ा गया है और बिटमैप में लिखा गया है। दुर्भाग्य से, व्यू के अदृश्य भाग में बिटमैप काला है।एंड्रॉइड: oversized दृश्य से बिटमैप

प्रश्न:
मैं दृश्य के अदृश्य भाग को कैप्चर कैसे कर सकता हूं?

कोड:

public class NewRelativeLayout extends RelativeLayout{ 

private Bitmap bmp; 

public NewRelativeLayout(Context context){ 
    super(context); 
    this.setLayoutParams(new RelativeLayout.LayoutParams(2000,2000)); 
    // add here methods to configure the RelativeLayout or to add children 
    } 

//This is the first method 
public void makeSnapshot_Method1(){ 
    this.setDrawingCacheEnabled(true); 
    bmp = Bitmap.createBitmap(this.getDrawingCache()); 
    this.setDrawingCacheEnabled(false); 
    } 

//This is the second method 
public void makeSnapshot_Method2(){ 
    bmp = Bitmap.createBitmap(2000, 2000, Bitmap.Config.ARGB_8888); 
    Canvas helpCanvas = new Canvas(bmp); 
    this.draw(helpCanvas); 
    } 

}

उत्तर

0

पर जो चित्र को कैप्चर करना, दृश्य की पृष्ठभूमि या अग्रभूमि से छवि चाहते हैं निर्भर करता है। किसी भी तरह से आपको उनसे ड्रॉइंग ऑब्जेक्ट प्राप्त करना है, उन्हें बिटमैप ड्रायरेबल में डालें और बिटमैप को उनके से प्राप्त करें। कोड: -

BitmapDrawable bd=(BitmapDrawable) view.getBackground(); //if you need background image 
BitmapDrawable bd=(BitmapDrawable) view.getDrawable(); //if you need foreground image (Only available to some views who have an android:src xml property) 
Bitmap bm=bd.getBitmap(); 

मुझे आशा है कि यह आपके लिए काम करेंगे।

+0

आपकी तेज प्रतिक्रिया के लिए धन्यवाद निर्माता। View.getDrawable() विधि केवल दृश्यों द्वारा समर्थित है, उदाहरण के लिए ImageView की तरह एक अग्रभूमि चित्र "पकड़ें"। रिलेवेटलाइट्स, लीनियर लेआउट्स, टेक्स्ट व्यू इत्यादि जैसे अन्य सभी दृश्य इस विधि का समर्थन नहीं करते हैं। अधिकांश इंटरनेट फ़ोरम एक दृश्य से बिटमैप स्क्रीनशॉट (यानी पृष्ठभूमि प्लस फोरग्राउंड) बनाने के लिए विधि 1 या 2 (मेरी पोस्ट देखें) की अनुशंसा करते हैं। Oversized दृश्यों के लिए समस्या अभी भी अनसुलझा है। कोई अन्य विचार? –

+0

ठीक है, मैंने पहले ही उल्लेख किया है कि view.getDrawable() पोस्ट में प्रत्येक दृश्य द्वारा समर्थित नहीं है। उन दो तरीकों से ऑफ-स्क्रीन पार्ट्स समेत पूर्ण छवि मिलती है, हो सकता है कि आप कैनवास और कस्टम व्यू का उपयोग करके उन दो अलग-अलग छवियों को एक दृश्य में डालने का प्रयास कर सकें (यदि भूमिगत एक पारदर्शी पृष्ठभूमि पीएनजी छवि है) और प्राप्त करें वहां से आकर्षित करने योग्य, हालांकि मैंने कभी कोशिश नहीं की, इसलिए यह नहीं बता सकता कि यह कैसे काम करेगा, लेकिन यदि आप इसका पालन कर सकते हैं तो आपको जो चाहिए वह प्राप्त हो सकता है। – noob

+0

GetDrawingCache() विधि केवल ऑन-स्क्रीन छवि देने का इरादा है, इसलिए मुझे नहीं लगता कि यह आपके लिए काम करेगा। GetDrawingCache (सत्य) का उपयोग करना आपके लिए काम कर सकता है। एक और विचार स्क्रीन फिट करने के लिए लेआउटपैम का उपयोग करके दृश्य का आकार बदलना और फिर वहां से ड्राइंग कैश प्राप्त करना हो सकता है। – noob

0

मैं स्क्रीन पर मौजूद सभी पंक्तियों को प्राप्त करने के लिए, सूची दृश्य के लिए इसे समझने की कोशिश भी कर रहा हूं।

मैं चीजों के बहुत सारे मैं चाहते हैं साझा करने के लिए मिल गया है:

यहाँ कोई पूछता है एक बिटमैप एक दृश्य है कि तैयार नहीं से बनाया जा सकता है, तो: Bitmap from View not displayed on Android

यहाँ वे दावा करते हैं कि यह एक नकली है और यह है यह भी सही ढंग से उत्तर दिया (?) इसमें कुछ कोडिंग के साथ एक यूआरएल है जो पुराना है और संकलित नहीं करता है। इसके अलावा संभावित डुप्लिकेट प्रश्न ने मेरी मदद नहीं की। Android get full View as Bitmap

मुझे लगता है कि मैं इसे इस विधि के माध्यम से कर पाने की कोशिश करेंगे: List View using bitmap पहले से ही एक ही विचार के साथ आया था, अब मैं अभी भी कैसे को खोजने के लिए की है।

आशा है कि आप इस जानकारी में से कुछ का उपयोग कर सकते हैं।

1

मैं इसके समाधान के लिए भी खोज कर रहा था और अंत में, अपने स्वयं के समाधान के साथ आने में कामयाब रहा जो वास्तव में काफी सरल है।

मेरे मामले में, मेरे पास LinearLayout था जिसमें View तत्व शामिल थे, जिनमें से कुछ स्क्रीन पर नहीं थे, स्क्रीन स्क्रीन के अंत में लंबवत रूप से स्क्रीन पर नहीं थे। मैं View को बिटमैप के रूप में सहेजने में सक्षम था (नीचे loadBitmapFromView() देखें) लेकिन स्क्रीन के नीचे से विस्तारित होने पर परेशानी थी।

मेरा समाधान LinearLayoutScrollView समग्र का हिस्सा बनाना था।

उदा।

यह:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/my_linear_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
> 
<!-- Some Views added here at runtime --> 
</LinearLayout> 

बने:wrap_content की

नोट उपयोग को सुनिश्चित करने scrollview अपनी सामग्री की ऊंचाई के पैमाने।

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scroll" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    > 

    <LinearLayout 
     android:id="@+id/my_linear_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
    > 
     <!-- Some Views added here at runtime --> 
    </LinearLayout> 
</ScrollView> 

यह सुनिश्चित करना है कि गुप्त आइटम मैन्युअल रूप से बाहर रखा जा सकता है जब मैं एक बिटमैप के रूप में View बचाना चाहती थी लग रहा था। मैंने बिटमैप को सहेजने के लिए निम्न विधि का उपयोग किया। मैंने इसे बहुत पहले एसओ पर पाया लेकिन मुझे सही तरीके से संदर्भित करने के लिए प्रश्न नहीं मिल रहा है (जो भी आप हैं - धन्यवाद!)।

निम्न विधि के लिए, मैं ऊपर LinearLayout (my_linear_layout) के संदर्भ में पास करता हूं।

public static Bitmap loadBitmapFromView(View view) { 
    Bitmap bitmap = null; 

    // width measure spec 
    int widthSpec = View.MeasureSpec.makeMeasureSpec(
      view.getMeasuredWidth(), View.MeasureSpec.AT_MOST); 
    // height measure spec 
    int heightSpec = View.MeasureSpec.makeMeasureSpec(
      view.getMeasuredHeight(), View.MeasureSpec.AT_MOST); 

    // measure the view 
    view.measure(widthSpec, heightSpec); 

    // set the layout sizes 
    int left = view.getLeft(); 
    int top = view.getTop(); 
    int width = view.getMeasuredWidth(); 
    int height = view.getMeasuredHeight(); 
    int scrollX = view.getScrollX(); 
    int scrollY = view.getScrollY(); 

    view.layout(left, top, width + left, height + top); 

    // create the bitmap 

    bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), 
      Bitmap.Config.ARGB_8888); 

    // create a canvas used to get the view's image and draw it on the 
    // bitmap 

    Canvas c = new Canvas(bitmap); 
    // position the image inside the canvas 
    c.translate(-view.getScrollX(), -view.getScrollY()); 
    // get the canvas 
    view.draw(c); 

    return bitmap; 
} 
संबंधित मुद्दे