2012-07-04 23 views
23

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

क्या प्रदर्शन आकार से बड़े दृश्य में कैमरे के पूर्वावलोकन को पूरी तरह से बढ़ाना संभव है? सतह दृश्य दृश्य लेआउट पैराम्स को match_parent पर बस सेट करके लौटाए गए पूर्वावलोकन पिक्सेल आयामों से बड़े सतह दृश्य को बढ़ाना संभव है, लेकिन इसके परिणामस्वरूप कुछ दिशा में विरूपण होता है और पूर्वावलोकन तब तक संभव होता है जब तक पूर्वावलोकन प्रदर्शन को भरता न हो। ऐसा लगता है कि प्रदर्शन के बाहर पूर्वावलोकन करना असंभव है, और हार्डवेयर (या ओएस) इस तरह के व्यवहार को सीमित करता है।

विषय पर another question है, लेकिन उस सवाल का दावा है कि स्क्रीन आयामों से अधिक SurfaceView बनाना संभव नहीं है, जो गलत है, जैसा कि मैंने लॉगिंग के साथ पाया है। हालांकि, ऐसा लगता है कि कैमरा पूर्वावलोकन हालांकि एक विशाल SurfaceView के पूर्ण आकार में नहीं बढ़ सकता है।

मेरे प्रयास:

मैं एक रिश्तेदार लेआउट, यह के भीतर एक FrameLayout है, और है कि भीतर मैं एक SurfaceView पैदा करते हैं। पूरे रिश्तेदार लेआउट की चौड़ाई 635 डीपी पर नीचे सेट की गई है, जो डिवाइस के स्क्रीन आकार को ~ दोगुनी है। FrameLayout इस आकार से मेल खाता है और इतने SurfaceView (प्रोग्राम के रूप में बाद में जोड़ा)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/camera_activity_layout" 
    android:layout_width="635dp" 
    android:layout_height="match_parent" > 

    <FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    </FrameLayout> 

</RelativeLayout> 

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

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 

    ... 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Camera.Parameters parameters = mCamera.getParameters(); 
     final DisplayMetrics dm = this.getResources().getDisplayMetrics(); 
      //getBestPreviewSize returns the best preview size, don't worry 
      //but some devices do not return one for all camera matching the aspect ratio 
     cameraSize = getBestPreviewSize(parameters, dm.heightPixels, dm.widthPixels); 

     if (cameraSize!=null) { 
      parameters.setPreviewSize(cameraSize.width, cameraSize.height); 
      mCamera.setParameters(parameters); 
     } 

     FrameLayout.LayoutParams frameParams = (FrameLayout.LayoutParams) this.getLayoutParams(); 

     frameParams.width = 800; //For argument's sake making this ~double the width of the display. Same result occurs if I use MATCH_PARENT 
     frameParams.height = LayoutParams.MATCH_PARENT; 
     this.setLayoutParams(frameParams); 

     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

      Log.d("surfChange","W/H of CamPreview (child) is "+this.getWidth()+"/"+this.getHeight()+" while parent is "); 
      Log.d("surfChange","W/H of holder (child) is "+mHolder.getSurfaceFrame().width()+"/"+mHolder.getSurfaceFrame().height()+" while parent is "); 
     } catch (Exception e){ 
     } 
    } 
}; 

मैं चिंतित हूँ कि एक ही रास्ता इस प्रयास में सफल होने के लिए किसी भी तरह एक ओपन सतह के लिए प्रस्तुत करने के लिए है, लेकिन इस apparently पूर्ण रंग में बहुत धीमी गति से हो सकता है। अगर कैमरा पूर्वावलोकन को आसानी से बढ़ाया जा सकता है और फिसल जाता है तो यह भी दर्द होता है।

समाधान में किसी भी प्रयास के लिए अग्रिम धन्यवाद।

+0

क्या आप अपना ऑनक्रेट() कोड पोस्ट कर सकते हैं। या जहां आप setcontentview() विधि –

+0

कहते हैं, तो आप उस कोड के बारे में उत्सुक क्यों हैं? यह बहुत बुनियादी था, और बस ऊपर साझा किए गए एक्सएमएल में सामग्री दृश्य सेट करें। –

+0

ठीक है तो मुझे लगता है कि खिड़की प्रबंधक से परे एक दृश्य का विस्तार करना संभव नहीं है, मैं वीडियो के एक खंड में ज़ूम की भी तलाश कर रहा हूं लेकिन सभी सतह दृश्य और कस्टम वीडियो दृश्य का उपयोग करके मुझे कोई भी नहीं मिला है, वीडियो आकार –

उत्तर

12

ठीक है, मुझे पता है कि यह उत्तर के रूप में बहुत देर हो चुकी है लेकिन यह संभव है। नीचे एंड्रॉइड एसडीके नमूना से कोड है। कोड के बाकी इस Android SDK डाउनलोड करें नमूने को लागू करने और Samples/android-10(one I used, could try whichever you want to target)/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java

class PreviewSurface extends ViewGroup implements SurfaceHolder.Callback { 
... 
@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if (changed && getChildCount() > 0) { 
     final View child = getChildAt(0); 

     final int width = r - l; 
     final int height = b - t; 

     int previewWidth = width; 
     int previewHeight = height; 
     if (mPreviewSize != null) { 
      previewWidth = mPreviewSize.width; 
      previewHeight = mPreviewSize.height; 
     } 

     // Center the child SurfaceView within the parent. 
     if (width * previewHeight > height * previewWidth) { 
      final int scaledChildWidth = previewWidth * height/previewHeight; 
      child.layout((width - scaledChildWidth)/2, 0, 
        (width + scaledChildWidth)/2, height); 
     } else { 
      final int scaledChildHeight = previewHeight * width/previewWidth; 
      child.layout(0, (height - scaledChildHeight)/2, 
        width, (height + scaledChildHeight)/2); 
     } 
    } 
} 
} 

इस कोड को छोटी से छोटी आयाम करने के लिए पूर्वावलोकन फिट करने का इरादा है के लिए जाना (जो गंदगी aspcect अनुपात नहीं करता है) को देखने के लिए और दूसरे आयाम पर काले सलाखों के लिए केंद्र। लेकिन अगर आप > को < पर फ़्लिप करते हैं तो आप जो चाहते हैं उसे प्राप्त करेंगे। पूर्व:

if (width * previewHeight < height * previewWidth) {... 
संबंधित मुद्दे