Android.widget.ImageView की चौड़ाई और ऊंचाई कैसे प्राप्त करें?


272
╔══════════════════════════════════════════════╗   ^
 ImageView    ╔══════════════╗                   |
                                               |
               Actual image                    |
                                               |60px height of ImageView
                                               |
                                               |
              ╚══════════════╝                   |
╚══════════════════════════════════════════════╝   
<------------------------------------------------>
                   90px width of ImageView

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

मैं ImageView की ऊँचाई और चौड़ाई प्राप्त करने की कोशिश कर रहा हूँ, लेकिन 0 मुझे दोनों मामलों में वापस कर दिया गया है।

int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();

यह मुझे 0 रिटर्न देता है यहां तक ​​कि इसमें डिफ़ॉल्ट ऊंचाई और चौड़ाई है


«जैसा कि मैं नहीं चाहता कि डिफ़ॉल्ट मान दें क्योंकि जब भी मैं इसकी ऊंचाई और चौड़ाई बदलता हूं तो मुझे इसे कोड में बदलना होगा» - जिसे कोई बदल सकता है? छवि दृश्य या संग्रहीत चित्र?
पेड्रो लौरेइरो

क्या आप अभी उपयोग नहीं कर सकते android:scaleType="centerInside"?
बड़े परदे

2
@ नाइटक्रैकर: यह ASCII नहीं है।
जॉय

7
@ जब मैंने "ASCII" कहा तो मेरा मतलब था "ASCII कला", जिसमें केवल ASCII वर्ण सेट से अधिक कला शामिल है।
orlp

1
यह सीधे सवाल का जवाब नहीं देता है, लेकिन अगर आप सोच रहे हैं कि getHeight () / getWidth () 0 क्यों लौट रहे हैं, तो वे हमेशा 0 वापस करेंगे यदि आप उन तरीकों को कॉल करते हैं जो देखने से पहले "तैयार" किए गए हैं, यदि आप थे
onCreate

जवाबों:


222

इस सवाल पर मेरा जवाब आपकी मदद कर सकता है:

int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = iv.getMeasuredHeight();
        finalWidth = iv.getMeasuredWidth();
        tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
        return true;
    }
});

फिर आप onPreDraw () पद्धति से अपनी छवि स्केलिंग कार्य जोड़ सकते हैं।


8
उसके लिए बहुत अच्छा कोड भाई और तार्किक +1। आप ImageView प्रॉपर्टी Android सेट करके भी इसे प्राप्त कर सकते हैं: AdjustViewBounds = "true" to true :)
AZ_

अरे, लेकिन जब सूचक डीबगिंग नहीं करते हैं तो onPreDraw () क्यों होता है?
गीतांजलि

3
मुझे लगता है कि आपको vto.removeOnPreDrawListener (यह) जोड़ने की आवश्यकता है; onPreDraw ()
sagus_helgy

1
@ KK_07 सफ़रर्स की टिप्पणी के अनुसार संपादन देखें। बस आपको इसके साथ काम करने के बाद श्रोता को निकालना होगा।
केविन कोपॉक

6
आप अंतिम रूप देने के बिना एक आंतरिक वर्ग के अंदर अंतिमहाइट और फाइनलविड को मान कैसे प्रदान करते हैं?
क्रिस

29

मैंने अभी यह प्रॉपर्टी सेट की है और अब Android OS हर चीज़ का ध्यान रख रहा है।

एंड्रॉयड: adjustViewBounds = "true"

अपने लेआउट में इसका इस्तेमाल करें। xml जहाँ आपने अपना ImageView: D लगाया है


4
@jww मैं वास्तव में नकारात्मक मतदाताओं को जवाब नहीं देता: पी, पहले GetWidth के बारे में पढ़ा और Android प्रलेखन में प्राप्त किया। फिर नीचे आकर लोगों को वोट दें।
AZ_

27

मुझे इसकी चौड़ाई द्वारा छवि की चौड़ाई और ऊंचाई मिल सकती है;

int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();

14

ImageView के कारण 0 हैं इसका कारण यह है कि जब आप उन्हें क्वेरी कर रहे होते हैं, तो दृश्य अभी भी लेआउट का प्रदर्शन नहीं करता है और चरणों को मापता है। आपने केवल दृश्य को बताया कि यह लेआउट में "कैसे व्यवहार करेगा", लेकिन यह अभी भी गणना नहीं की गई है कि प्रत्येक दृश्य को कहां रखा जाए।

आप छवि को देखने के लिए आकार कैसे तय करते हैं? क्या आप मूल रूप से लागू स्केलिंग विकल्पों में से एक का उपयोग नहीं कर सकते हैं?


मैंने ImageView को डिफ़ॉल्ट ऊँचाई और चौड़ाई दी है, लेकिन जब मैं उन्हें कोड में लाने की कोशिश करता हूं तो यह मुझे वापस लौटा देता है। 0. मुझे लगता है कि मुझे पहले ViewView को बढ़ाना होगा। लेकिन कैसे?

मुझे पता है कि मेरे जवाब में। इसे फिर से पढ़ें :) मुझे लगता है कि आपका दृष्टिकोण पहले से ही फुला हुआ है। क्या आप इसे देख सकते हैं? यदि आप कर सकते हैं, तो यह फुलाया जाता है।
पेड्रो लौरेइरो

13

UI थ्रेड के लिए पोस्ट मेरे लिए काम करता है।

final ImageView iv = (ImageView)findViewById(R.id.scaled_image);

iv.post(new Runnable() {
            @Override
            public void run() {
                int width = iv.getMeasuredWidth();
                int height = iv.getMeasuredHeight();

            }
});

वास्तव में मददगार!
Xavi जिमेनेज

गलत। UI से चौड़ाई और ऊंचाई को छोड़ना यह गारंटी नहीं देता है कि वे मान तैयार हैं। महंगाई को देखने का
मतलब

6

आपकी xml फाइल:

 <ImageView android:id="@+id/imageView"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/image"
               android:scaleType="fitXY"
               android:adjustViewBounds="true"/>

आपकी जावा फ़ाइल:

ImageView imageView = (ImageView)findViewById(R.id.imageView);
     int width = imageView.getDrawable().getIntrinsicWidth();
     int   height = imageView.getDrawable().getIntrinsicHeight();

5

मुझे लगता है कि आप Android OS को इस बात का ध्यान रखने दे सकते हैं। fitXYछवि दृश्य पर स्केल प्रकार सेट करें और यह प्रदर्शित होने वाली छवि को दृश्य के वर्तमान आकार को फिट करने के लिए आकार होगा।

<ImageView 
    android:layout_width="90px" 
    android:layout_height="60px"
    android:scaleType="fitXY" />

4

गतिविधि का onWindowFocusChanged विधि में ImageView की चौड़ाई और ऊंचाई प्राप्त करना सबसे सरल तरीका है

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    height = mImageView.getHeight();
    width = mImageView.getWidth();

}

1
onWindowFocusChanged API18 और अधिक समय पर काम करता है, और यह सबसे अच्छा तरीका नहीं हो सकता ... हालांकि धन्यवाद
मिलाद gh

1

यदि आपने गतिशील रूप से एक से अधिक चित्र बनाए हैं, तो यह प्रयास करें:

// अपने चित्र सरणी को इनिशियलाइज़ करें

private ImageView myImages[] = new ImageView[your_array_length];

// प्रोग्राम बनाएं और पैरेंट व्यू में जोड़ें

 for (int i = 0; i < your_array_length; i++) {
                myImages[i] = new ImageView(this);
                myImages[i].setId(i + 1);
                myImages[i].setBackgroundResource(your_array[i]);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                        frontWidth[i], frontHeight[i]);
                ((MarginLayoutParams) params).setMargins(frontX_axis[i],
                        frontY_axis[i], 0, 0);
                myImages[i].setAdjustViewBounds(true);
                myImages[i].setLayoutParams(params);

                if (getIntent() != null && i != your_array,length) {
                    final int j = i;
                    myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        public boolean onPreDraw() {
                            myImages[j].getViewTreeObserver().removeOnPreDrawListener(this);
                    finalHeight = myImages[j].getMeasuredHeight();
                        finalWidth = myImages[j].getMeasuredWidth();
                    your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth);
                            return true;
                        }
                    });
                }
                your_parent_layout.addView(myImages[i], params);
            }

// बस। हैप्पी कोडिंग।


-2

इस u द्वारा मेरे मित्र को db.BT में संग्रहीत छवि की ऊँचाई नहीं मिल रही है। लेकिन आपको ऊँचाई मिल रही है। छवि की ऊँचाई पाने के लिए आपको db से बिटमैप बनाना होगा।


2
मैं छवि की ऊँचाई और चौड़ाई जानता हूँ, लेकिन मैं ImageView की ऊँचाई और चौड़ाई जानना चाहता हूँ ताकि मैं इसे अपने हिसाब से माप सकूँ। मुझे उम्मीद है कि आपको मेरी बात सही लगेगी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.