android - كيفية قياس صورة في ImageView للحفاظ على نسبة العرض إلى الارتفاع




android-imageview image-scaling (14)

  1. نعم ، بشكل افتراضي ، سيعمل Android على تغيير حجم صورتك لتلائم ImageView ، مع الحفاظ على نسبة العرض إلى الارتفاع. ومع ذلك ، تأكد من أنك تقوم بتعيين الصورة إلى ImageView باستخدام android:src="..." بدلاً من android:background="..." . src= يجعله مقياسًا لصورة الحفاظ على نسبة العرض إلى الارتفاع ، ولكن background= تجعله مقياسًا ويشوه الصورة ليجعلها مناسبة تمامًا لحجم ImageView. (يمكنك استخدام خلفية ومصدر في نفس الوقت ، والتي يمكن أن تكون مفيدة لأشياء مثل عرض إطار حول الصورة الرئيسية ، باستخدام ImageView واحد فقط.)

  2. يجب أيضًا أن تشاهد android:adjustViewBounds لجعل ImageView يتغير حجمه ليتناسب مع الصورة التي تم إعادة قياسها. على سبيل المثال ، إذا كان لديك صورة مستطيلة في ما يكون عادةً صورة ImageView مربعة ، فسيؤدي ضبط viewBounds = true إلى تغيير حجم ImageView ليكون مستطيلاً كذلك. يؤثر ذلك بعد ذلك على كيفية وضع طرق العرض الأخرى حول ImageView.

    ثم كما كتب Samuh ، يمكنك تغيير الطريقة التي android:scaleType الصور الافتراضية باستخدام المعلمة android:scaleType . بالمناسبة ، أسهل طريقة لاكتشاف كيفية عمل هذا هي ببساطة تجربة نفسك قليلاً! تذكر فقط أن ننظر إلى التخطيطات في المحاكي نفسه (أو الهاتف الفعلي) لأن المعاينة في Eclipse عادة ما تكون خاطئة.

في Android ، قمت بتعريف layout_width ImageView layout_width fill_parent (الذي يشغل العرض الكامل للهاتف).

إذا كانت الصورة التي layout_width في ImageView أكبر من layout_width ، layout_width Android layout_width ، layout_width كذلك؟ لكن ماذا عن الارتفاع؟ عندما يقوم نظام Android بتحجيم الصورة ، هل سيحافظ على نسبة العرض إلى الارتفاع؟

ما أجده هو أن هناك بعض المساحة البيضاء في الجزء العلوي والسفلي من ImageView عندما يقوم Android بتحجيم صورة أكبر من ImageView . هل هذا صحيح؟ إذا كانت الإجابة نعم ، فكيف يمكنني إزالة تلك المساحة البيضاء؟


إذا كنت تريد ImageView أن كلا المقاييس صعودا وهبوطا مع الحفاظ على نسبة الارتفاع المناسب ، إضافة هذا إلى XML الخاص بك:

android:adjustViewBounds="true"
android:scaleType="fitCenter"

أضف هذا إلى شفرتك:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

استغرق الأمر بعض الوقت للحصول على هذا العمل ، ولكن يبدو أن هذا يعمل في الحالات التي تكون فيها الصورة أصغر من عرض الشاشة وأكبر من عرض الشاشة ، ولا تقوم بتضمين الصورة.


إلقاء نظرة على ImageView.ScaleType للتحكم وفهم طريقة تغيير الحجم يحدث في ImageView . عندما يتم تغيير حجم الصورة (مع الحفاظ على نسبة العرض إلى الارتفاع) ، تكون الاحتمالات إما أن يصبح ارتفاع أو عرض الصورة أصغر من أبعاد ImageView .


استخدم هذه الخصائص في ImageView للحفاظ على نسبة العرض إلى الارتفاع:

android:adjustViewBounds="true"
android:scaleType="fitXY"

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />

جرب استخدام android:layout_gravity لـ ImageView:

android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_weight="1"

المثال أعلاه يعمل بالنسبة لي.


راجع android:adjustViewBounds .

قم بتعيين هذا إلى true إذا كنت تريد أن يقوم ImageView بضبط حدوده للحفاظ على نسبة العرض إلى الارتفاع الخاصة به.


عند القيام بهذا بطريقة برمجية ، تأكد من استدعاء المستوطنين بالترتيب الصحيح:

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)

لأي شخص آخر لديه هذه المسألة بالذات. لديك ImageView (أو View أخرى) التي تريد أن يكون لها عرض fill_parent وارتفاع fill_parent بالتناسب:

أضف هاتين ImageView إلى ImageView :

android:adjustViewBounds="true"
android:scaleType="centerCrop"

وتعيين عرض ImageView ل fill_parent والارتفاع إلى wrap_content .

أيضًا ، إذا كنت لا تريد اقتصاص صورتك ، فجرّب ذلك:

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"

لا تحتاج إلى أي رمز java. يجب عليك :

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />

المفتاح في مطابقة الأم للعرض والارتفاع


لدي خوارزمية لتوسيع نطاق الصورة النقطية لأفضل تهيئة لأبعاد الحاوية ، مع الحفاظ على نسبة العرض إلى الارتفاع. يرجى ايجاد حل بلدي here

آمل أن يساعد هذا شخص أسفل المسلك!


هذا العمل بالنسبة لي:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"

هذا حل مشكلتي

android:adjustViewBounds="true"
android:scaleType="fitXY"

Pass your imageview and based on screen height and width you can make it  


    public void setScaleImage(EventAssetValueListenerView view){
        // Get the ImageView and its bitmap
        Drawable drawing = view.getDrawable();
        Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
        // Get current dimensions
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        float xScale = ((float) 4) / width;
        float yScale = ((float) 4) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();

        view.setImageDrawable(result);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }


imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));




image-scaling