কিভাবে একটি android.widget.I छवि ভিউ এর প্রস্থ এবং উচ্চতা পাবেন?


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

আমার কিছু ডিফল্ট উচ্চতা এবং প্রস্থের সাথে একটি চিত্র ভিউ রয়েছে, চিত্রগুলি ডিবিতে সংরক্ষণ করা হয় এবং আমি চিত্রের উচ্চতার প্রস্থ অনুযায়ী চিত্র স্কেল করতে চাই। যেহেতু আমি এটি ডিফল্ট মান দিতে চাই না কারণ যখনই আমি এর উচ্চতা এবং প্রস্থ পরিবর্তন করি তখন আমাকে কোডেও এটি পরিবর্তন করতে হবে।

আমি ইমেজভিউর উচ্চতা এবং প্রস্থ পাওয়ার চেষ্টা করছি তবে উভয় ক্ষেত্রেই 0 আমাকে ফিরিয়ে দিয়েছে।

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

এটি আমাকে 0 প্রদান করে এমনকি এটির ডিফল্ট উচ্চতা এবং প্রস্থও রয়েছে


«যেহেতু আমি ডিফল্ট মান দিতে চাই না কারণ যখনই আমি এর উচ্চতা এবং প্রস্থ পরিবর্তন করি তখন আমাকে কোডেও এটি পরিবর্তন করতে হবে which - কোনটি পরিবর্তন করতে পারে? ইমেজ ভিউ নাকি স্টোর করা ছবি?
পেড্রো লোরেইরো

আপনি শুধু ব্যবহার করতে পারবেন না android:scaleType="centerInside"?
14'11 এ বড়স্টোনস

2
@ নাইটক্র্যাকার: এটি ASCII নয়।
জোয়

7
@ Јοеу আমি যখন "এএসসিআইআই" বললাম তখন আমি "এএসসিআইআই আর্ট" বলতে চাইছিলাম, যা কেবলমাত্র এএসসিআইআই চরিত্রের সমন্বয়ে গঠিত তার চেয়ে বেশি শিল্পকে অন্তর্ভুক্ত করে।
orlp

1
এটি সরাসরি প্রশ্নের উত্তর দেয় না, তবে আপনি যদি ভাবছেন যে কেন getHeight () / getWidth () 0 প্রত্যাবর্তন করছে, দৃশ্যটি "আঁকানো" হওয়ার আগে আপনি যদি এই পদ্ধতিগুলি কল করেন তবে তারা সর্বদা 0 ফিরে আসবে অর্থাত্ যদি আপনি ছিলেন এই পদ্ধতিগুলিকে
অনক্রিয়েটে

উত্তর:


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;
    }
});

তারপরে আপনি অনপ্রেড্রু () পদ্ধতির মধ্যে থেকে আপনার চিত্র স্কেলিংয়ের কাজটি যুক্ত করতে পারেন।


8
খুব সুন্দর কোড ভাই এবং তার জন্য যৌক্তিক +1। আপনি ইমেজভিউ সম্পত্তি অ্যান্ড্রয়েড সেট করেও এটি অর্জন করতে পারেন: অ্যাডজুটভিউবাউন্ডস = "সত্য" থেকে সত্য :)
এজেড_

আরে তবে ডিবাগিং পয়েন্টার চলাকালীন প্রিড্রু () -র দিকে যেতে হবে না কেন এটি এমন?
গীতাঞ্জলি

3
আমার মনে হয় আপনার ভিটিও.রেমভঅনপ্রাইড্রোললিস্টনার যুক্ত করতে হবে (এটি); প্রিড্রউ () এর অভ্যন্তরে লাইন করুন
স্যাগাস_হেলজি

1
@ কেকে_07 দুঃখকষ্টারের মন্তব্য অনুসারে সম্পাদনাটি দেখুন। আপনার শ্রোতার সাথে এটি সম্পন্ন করার পরে কেবল সরিয়ে ফেলতে হবে।
কেভিন কপক

6
আপনি কীভাবে কোনও চূড়ান্ত না করে কোনও অভ্যন্তরীণ শ্রেণীর ভিতরে চূড়ান্ত উচ্চতা এবং চূড়ান্ত প্রস্থকে মান নির্ধারণ করবেন?
ক্রিস

29

আমি কেবল এই সম্পত্তিটি সেট করেছি এবং এখন অ্যান্ড্রয়েড ওএস সবকিছুর যত্ন নিচ্ছে।

অ্যান্ড্রয়েড adjustViewBounds = "সত্য"

আপনার লেআউট.এক্সএমএল এ এটি ব্যবহার করুন যেখানে আপনি নিজের চিত্র ভিউ: ডি লাগিয়েছেন


4
@jww আমি সত্যিই নেতিবাচক ভোটারদের জবাব দিচ্ছি না: পি, প্রথমে গেটউইথ এবং অ্যান্ড্রয়েড ডকুমেন্টেশনে getMeasured সম্পর্কে পড়ুন। তারপরে আসুন এবং ভোট জনগণের নিচে নামুন।
এজেড_

27

আমি এর অঙ্কনযোগ্য দ্বারা চিত্র প্রস্থ এবং উচ্চতা পেতে পারে;

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

14

চিত্রভিউয়ের মাত্রাগুলি 0 হওয়ার কারণ হ'ল আপনি যখন এগুলি অনুসন্ধান করছেন তখন দৃশ্যটি এখনও বিন্যাস এবং পরিমাপের পদক্ষেপগুলি সম্পাদন করে না। আপনি কেবলমাত্র লেআউটে কীভাবে "আচরণ" করবেন তা দেখিয়েছেন, তবে প্রতিটি ভিউ কোথায় রাখবেন তা এখনও গণনা করা হয়নি।

আপনি কীভাবে চিত্রের দৃশ্যের জন্য আকারটি স্থির করবেন? আপনি কেবল স্থানীয়ভাবে প্রয়োগ করা একটি স্কেলিং বিকল্প ব্যবহার করতে পারবেন না?


আমি ইমেজভিউকে ডিফল্ট উচ্চতা এবং প্রস্থ দিয়েছি তবে আমি কোডগুলিতে তাদের আনার চেষ্টা করলে এটি আমাকে ফিরে আসে 0. আমি মনে করি আমাকে প্রথমে চিত্রের ভিউতে স্ফীত করতে হবে। কিন্তু কিভাবে?
এজেড_

আমি আমার উত্তরে এটি সম্বোধন করি। এটি আবার পড়ুন :) আমি মনে করি আপনার দৃষ্টিভঙ্গি ইতিমধ্যে স্ফীত। তুমি কি এটি দেখতে পাও? আপনি যদি পারেন তবে তা স্ফীত
পেড্রো লোরেইরো

13

ইউআই থ্রেডে পোস্ট করা আমার পক্ষে কাজ করে।

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();

            }
});

সত্যিই সহায়ক!
জাভি জিমেনেজ

ভুল। ইউআই থেকে প্রস্থ এবং উচ্চতা জিজ্ঞাসা করা গ্যারান্টি দেয় না যে এই মানগুলি প্রস্তুত। দর্শন মুদ্রাস্ফীতিটি আপনার নমুনায় সবেমাত্র শেষ হয়েছে, তবে এটি খুব ভালভাবে হতে পারে
রোমেক্স

6

আপনার এক্সএমএল ফাইল:

 <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 কে আপনার জন্য এটি যত্ন নিতে দিতে পারেন care ইমেজভিউতে স্কেল প্রকারটি সেট করুন fitXYএবং এটি যে চিত্রটি প্রদর্শিত হবে তা ভিউয়ের বর্তমান আকারের সাথে মাপসই করা হবে।

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

4

সরলতম উপায় হ'ল ক্রিয়াকলাপের ওয়ানডাইফোকাসে পরিবর্তিত পদ্ধতিতে কোনও চিত্র ভিউয়ের প্রস্থ এবং উচ্চতা পাওয়া

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

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

}

1
অন ​​উইন্ডোফোকাস পরিবর্তিত হয়েছে কেবল এপিআই 18 এবং তারও বেশি সময় ধরে কাজ করে, এবং এটি সর্বোত্তম উপায় হতে পারে না ... তবে ধন্যবাদ
মিলাদ 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

আমার এই বন্ধুটি আপনার ডিবিতে সজ্জিত চিত্রের উচ্চতা পাচ্ছে না তবে আপনি দেখার উচ্চতা পাচ্ছেন image চিত্রের উচ্চতা পাওয়ার জন্য আপনাকে ডিবি, এস এর চিত্র থেকে বিটম্যাপ তৈরি করতে হবে and এবং আপনি চিত্রের দৈর্ঘ্যের উচ্চতা এবং প্রস্থ আনতে পারবেন না


2
আমি চিত্রটির উচ্চতা এবং প্রস্থ জানি কিন্তু আমি ইমেজভিউর উচ্চতা এবং প্রস্থ জানতে চাই যাতে আমি এটি অনুসারে স্কেল করতে পারি। আমি আশা করি আপনি আমার বক্তব্য পাবেন।
এজেড_
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.