2011-02-11 11 views
5

मैं एंड्रॉइड के लिए एक उन्नत वास्तविकता अनुप्रयोग बनाने का प्रयास कर रहा हूं और सतह के दृश्यों को ले जाने की समस्या में आया हूं। मुझे कैमरे के पूर्वावलोकन को प्रदर्शित करने के लिए एक सतह दृश्य की आवश्यकता है जिस पर मैं ग्राफिक्स ओवरले करूँगा, और मुझे अपने ग्राफिक्स को आकर्षित करने के लिए सतह दृश्य की आवश्यकता है। इस दूसरी सतह को कैमरा पूर्वावलोकन के ऊपर भी खींचा जाना चाहिए, लेकिन एक पारदर्शी पृष्ठभूमि है। मेरे वर्तमान कार्यान्वयन में, मेरे पास सतह के दृश्य दोनों काम कर रहे हैं और दिख रहे हैं जैसा कि उन्हें माना जाता है, लेकिन पृष्ठभूमि पारदर्शी नहीं है और इसलिए कैमरे के पूर्वावलोकन सतह दृश्य पर चित्रित ग्राफिक्स के साथ दूसरे सतह दृश्य की कोई उपस्थिति नहीं है। यह कैसे प्राप्त किया जा सकता है? कई स्टैक ओवरफ्लो प्रश्नों के साथ-साथ अन्य मंचों को खोजने पर मैं इस मामले से संबंधित कई विवादित विचारों में आया हूं। कुछ कहते हैं कि एंड्रॉइड में लेयरिंग सतह के दृश्य असंभव हैं जबकि अन्य कहते हैं कि यह एक अलग लेआउट (फ्रेमलेआउट बनाम लिनियरलाउट?) का उपयोग करने का मामला है, विशेष रूप से, मेरे कार्यान्वयन में दो विचार शामिल हैं: एक वर्ग, कस्टमकैमेरा व्यू, जो सतह दृश्य और कक्षा को बढ़ाता है , CustomDrawView, जो CustomCameraView के बाद दिखाई देने वाले CustomDrawView के साथ फ़्रेमलेआउट में स्थित SurfaceView भी बढ़ाता है। इन्हें कैसे स्तरित किया जा सकता है ताकि कस्टमड्राव्यू कस्टमकैमेरा व्यू पर अतिरंजित दिखाई दे?एंड्रॉइड में एक फ्रेमलेआउट में स्तरित सतह दृश्य

+0

क्या आप अपने दृश्य के एक्सएमएल कोड और शायद एक त्वरित स्क्रीन पोस्ट करना चाहते हैं? तब कुछ लोग परीक्षण और समझ सकते थे। –

उत्तर

7

मुझे लगता है कि बहुत से लोगों ने यह कोशिश की है। एक Google इंजीनियर ने कहा (here) स्पष्ट रूप से, आपको सतह दृश्यों को ढेर करने से बचना चाहिए। यहां तक ​​कि अगर किसी को ऐसा करने के लिए कुछ चाल मिल गई है, तो यह शायद असंगत है और समस्याओं का कारण बन जाएगी।

मैं इस तीन विकल्प देता है, आपकी आवश्यकताओं के आधार लगता है:

  • देखें (रों) भूतल दृश्य के शीर्ष पर

कैमरा पूर्वावलोकन के लिए एक सतह देखें का प्रयोग करें और ढेर शीर्ष पर विचार इसका इस दृष्टिकोण का नुकसान यह है कि "सामान्य" दृश्यों पर ड्राइंग ए) धीमा है और बी) यूआई थ्रेड में होता है। यदि आप धागे को स्वयं लागू करते हैं तो आप चारों ओर मिल सकते हैं। लेकिन आम तौर पर, यह संभवतः यह तरीका है कि यदि आपके ओवरले में यूआई तत्वों या कुछ ड्रायबल्स जैसे कुछ शामिल हैं जिन्हें अक्सर अद्यतन करने की आवश्यकता नहीं होती है।

  • एक SurfaceView

इस में सब कुछ करते हैं रनटाइम के दौरान यो बेहतर प्रदर्शन और कम भूमि के ऊपर दे देंगे। आपके पास सिर्फ एक भूतल दृश्य है। अपने SurfaceView पर ओवरले को मिश्रित करें और वहां सबकुछ खींचें। बेशक, आप दोनों दृष्टिकोणों को जोड़ सकते हैं।

  • एक GLSurfaceView

में सब कुछ करते हैं यह शायद वास्तविक प्रदर्शन के लिए जाने का रास्ता है। उपरोक्त की तरह, लेकिन GLSurfaceView में ओपनजीएल बनावट के लिए कैमरा दृश्य प्रतिपादन के साथ।

2

मैं इस काम के निम्नलिखित दृष्टिकोण का उपयोग कर कैमरे के SurfaceView ऊपर 2 पारदर्शी विचारों होने मिला:

मेरे गतिविधि onCreate() विधि में अपने सभी विचारों सेट, मुझे लगता है कि किसी भी लेआउट फ़ाइल का कोई उपयोग नहीं करते हैं। यह इस प्रकार है के रूप में दिखता है:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(null); //savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    cameraPreview = new CameraPreview(this); 
    addContentView(cameraPreview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    animationView = new AnimationView(this); 
    addContentView(animationView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    crosslinesView = new CrosslinesView(this); 
    addContentView(crosslinesView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
} 

cameraPreview प्रकार SurfaceView, animationView की है और crosslinesViews प्रकार View के हैं। 2 बाद के विचारों के onDraw() निम्नानुसार दिखते हैं:

protected void onDraw(Canvas canvas) { 
    // Have the view being transparent 
    canvas.drawARGB(0, 0, 0, 0); 
    // Your drawing code goes here 
    // ... 
} 

शुभकामनाएँ!

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