2012-02-10 8 views
6

अद्यतन: एकाधिक डिवाइस स्क्रीन आयाम एक लाल हेरिंग है - समस्या यह है कि स्क्रीन स्क्रीन भरने के लिए छवि ठीक से स्केल नहीं होती है - इवान के उत्तर पर टिप्पणियां देखें।डिवाइस स्क्रीन आयाम स्केल किए गए छवि दृश्यों पर अजीब प्रभाव है

मैं एक छवि के साथ एक लेआउट फ़ाइल है:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/image" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:adjustViewBounds="true" 
    android:scaleType="centerCrop" /> 

तो मैं एक drawable है, जो छोटा है और को बढ़ाया जाना चाहिए आवंटित:

setContentView(R.layout.image_story); 
ImageView image = (ImageView)findViewById(R.id.image); 
image.setImageDrawable(s.image); 

यहाँ है कि यह कैसे दो पर प्रदान की गई है विभिन्न स्क्रीन आयामों के साथ एवीडी। ये वही होना चाहिए (नीचे विस्तृत प्रश्न)। बड़ी छवियों के लिए खेद है।

scaleType साथ

= centerCrop:

centerInside

AVDs साथ

:

संपादित करें:

layout_height = "fill_parent" और scaleType = साथ

"centerInside"

मैं मूलभूत मूल्यों के साथ एक 2.1 AVD है, तो स्क्रीन छोटा होता है , और यह बिल्कुल अपेक्षित रूप से काम करता है- चौड़ाई को भरने के लिए छवि को बढ़ाया जाता है, और दृश्य ऊंचाई स्केल की गई ऊंचाई पर लपेटा जाता है।

एक लंबे समय तक स्क्रीन के साथ

मेरे Droid बायोनिक पर, और एक ही स्क्रीन आयामों के साथ किसी भी AVD पर, इस छवि को काम नहीं करता चौड़ाई को भरने के लिए बढ़ाया है, लेकिन दृश्य मूल पूर्व करने के लिए लपेटा जाता है स्केल छवि ऊंचाई, तो ऊपर और नीचे फसल बंद कर रहे हैं।

मुझे नहीं पता कि डिवाइस स्क्रीन पहलू अनुपात पर इसका असर क्यों होगा। मैंने लेओनिक पर काम करने के लिए लेआउट पैरामीटर और स्केल प्रकारों के अनगिनत संयोजन की कोशिश की है। सब कुछ ठीक उसी तरह काम करता है जैसा कि छोटी स्क्रीन पर अपेक्षित है, न कि बड़े पैमाने पर। अगर मैं छवि ऊंचाई को dp में स्पष्ट रूप से सेट करता हूं, तो यह अपेक्षित कार्य करता है, लेकिन मुझे कभी नहीं पता कि छवि (या स्क्रीन) के आयाम क्या होंगे। कोई सुझाव?

+0

स्क्रीनशॉट सहायक हो सकते हैं क्योंकि मुझे पूरा यकीन नहीं है कि मैं सही चीज़ को चित्रित कर रहा हूं। – CaseyB

+0

स्क्रीनशॉट जोड़ा- क्या वह मदद करता है? छोटी स्क्रीन छवि को स्केल करने में अपेक्षित परिणाम दे रही है। इमेज व्यू का आकार बदलने के लिए बड़ा असुरक्षित आकार का उपयोग कर रहा है। –

+0

क्या आप वाकई layout_height = wrap_content चाहते हैं? –

उत्तर

4

एक बहुत अच्छा सवाल वास्तव में है कि scaleType="fitCenter" आप वांछित व्यवहार देना चाहिए।

यहाँ कारण यह (ImageView.onMeasure(int, int) [line 661] से) कि तरह बर्ताव कर रहा है:

// Try adjusting height to be proportional to width 
if (!done && resizeHeight) { 
    int newHeight = (int)((widthSize - pleft - pright) 
      /desiredAspect) + ptop + pbottom; 
    if (newHeight <= heightSize) { // line 661 
     heightSize = newHeight; 
    } // line 663 
} 

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

मुझे क्या नहीं मिलता है क्यों टी है उन्होंने प्रतिबंध लगाया कि नई ऊंचाई छोटी होनी चाहिए। यह केवल तभी समझ में आता है जब हमारी ऊंचाई आकार या तो बिल्कुल या AT_MOST है और ऊपरी बाउंड पर सेट किया गया है। अन्य मामलों में ऐसा होने के लिए जरूरी नहीं है।

(यानी। हम में AT_MOST प्रतिबंध मिला तो 663 के माध्यम से पूरा टुकड़ा 661 के बजाय वास्तव में वहाँ होना चाहिए

heightSize = resolveAdjustedSize(newHeight, mMaxHeight, heightSpec); 

के लिए एक और कॉल यकीन है कि हम केवल ऊंचाई प्रतिबंध का उपयोग जब यह प्रतिबंधित किया जाना चाहिए बनाने के लिए ऊंचाई स्पीक और ऊंचाई में ऊंचाई मान स्पीक नई ऊंचाई से छोटा है। जब तक हम परिवर्तनीय चौड़ाई का उपयोग नहीं करते हैं तब तक यहां नहीं हो सकता है।)

शायद, मुझे वहां कुछ याद आया। दोस्तों, जो कोई भी गूगल पर इस, पढ़ रही है टिप्पणी कृपया अगर आप किसी भी खामियां देखते हैं कि में, खासकर यदि आप एंड्रॉयड टीम का हिस्सा हैं :)

पुनश्च समाधान के लिए, मैं तुम्हें एक कस्टम को लागू कर सकते हैं सुझाव छवि दृश्य देखें और ओवरराइड (int, int) सीमाओं को अपने सटीक पहलू अनुपात में सेट करने के लिए ओवरराइड करें। अगर आपको वास्तविक कोड पर मदद की ज़रूरत है तो मुझे बताएं।

युपीडी मैं नाम को लिखने के लिए गूगल पर स्मार्ट एंड्रॉयड लोगों का ध्यान आकर्षित करने जा रहा हूँ (मैं लोगों को है गूगल सचेतक की स्थापना की आशा करती हूं कि): रोमेन लड़का, रोमन Nurik, रीटो मायर, कृपया ले इस चर्चा पर एक नज़र डालें।

+0

वास्तव में, केवल अगर 'नया हाइट' छोटा है तो 'ऊंचाई आकार' निम्नलिखित समायोजन को समझ में आता है, अन्यथा (यदि यह अधिक हो) तो हम कोड द्वारा ** चौड़ाई ** समायोजित कर चुके हैं जो पहले कुछ पंक्तियां हैं। –

+0

क्षमा करें, मुझे यह नहीं मिला। ऊपर एक अनुभाग है जो चौड़ाई समायोजित करता है, लेकिन यह केवल नए विड्ड को समायोजित करता है, जिसका उपयोग मैंने पोस्ट किए गए टुकड़े में नहीं किया है, इसलिए यह ऊंचाई के आकार से बड़ा होने के लिए नई हाइट की क्षतिपूर्ति नहीं करेगा। साथ ही, वह अनुभाग वास्तव में लेआउट_विड्थ विशेषता द्वारा चौड़ाई को बाधित करने के तरीके पर निर्भर करता है। यदि layout_with = "fill_parent", चौड़ाई समायोजन खंड कभी निष्पादित नहीं होगा क्योंकि आकार बदलें हमेशा गलत होगा। फिर भी, हमें अभी भी ऊंचाई समायोजित करने की आवश्यकता है, मुझे नहीं पता कि केवल उन मामलों में जहां नई ऊंचाई ऊंचाई से छोटी है आकार। क्या मैं कुछ भूल रहा हूँ? –

+0

[कोड का यह हिस्सा] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/ImageView.java#647) करता है 'चौड़ाई आकार' समायोजित करें। ध्यान दें कि यदि 'किया गया' सत्य पर सेट किया गया है, तो कोई ऊंचाई समायोजन नहीं किया जाएगा। –

0

जैसा कि मैं समझता हूं, आपको छवि को अपने पहलू अनुपात को बनाए रखने की आवश्यकता है।

<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/image" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:adjustViewBounds="true" 
    android:scaleType="fitCenter" /> 

यदि यह मदद नहीं करता है, मैनिफ़ेस्ट फ़ाइल को यह जोड़ने का प्रयास करें:

<supports-screens 
    android:resizeable="true" 
    android:smallScreens="true" 
    android:normalScreens="true" 
    android:largeScreens="true" 
    android:anyDensity="true" /> 
+0

'fitCenter' छवि को स्केल नहीं करता है, बस इसे मूल आकार (जैसे बड़े "fill_parent" और स्केल टाइप = "सेंटर इनसाइड" पर स्क्रीन के शीर्ष पर प्रदर्शित करता है, लेकिन स्क्रीन के शीर्ष पर)। मेनिफेस्ट में 'सपोर्ट-स्क्रीन' जोड़ने से कोई प्रभाव नहीं पड़ता है। –

+0

क्या आपने कुछ लेआउट ('LinearLayout', उदा।) में अपना 'ImageView' लपेटने का प्रयास किया है और फिर इस लेआउट के लिए' setContentView (..) 'को कॉल किया है? मैं लेआउट और लेआउट पैरा के विभिन्न संयोजनों के साथ प्रयोग करेंगे। –

+0

हाँ, सही कॉम्बो नहीं मिला है। अन्यथा मैं परीक्षण के लिए केवल 'ImageView' के साथ लेआउट फ़ाइल पर' setContentView' का उपयोग कर रहा हूं और ऐसा लगता है कि एक एकल तत्व तत्व के साथ 'लीनियरलाउट' जैसा ही लगता है। –

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