android - كيفية قياس صورة في ImageView للحفاظ على نسبة العرض إلى الارتفاع
android-imageview image-scaling (14)
نعم ، بشكل افتراضي ، سيعمل Android على تغيير حجم صورتك لتلائم ImageView ، مع الحفاظ على نسبة العرض إلى الارتفاع. ومع ذلك ، تأكد من أنك تقوم بتعيين الصورة إلى ImageView باستخدام
android:src="..."
بدلاً منandroid:background="..."
.src=
يجعله مقياسًا لصورة الحفاظ على نسبة العرض إلى الارتفاع ، ولكنbackground=
تجعله مقياسًا ويشوه الصورة ليجعلها مناسبة تمامًا لحجم ImageView. (يمكنك استخدام خلفية ومصدر في نفس الوقت ، والتي يمكن أن تكون مفيدة لأشياء مثل عرض إطار حول الصورة الرئيسية ، باستخدام ImageView واحد فقط.)يجب أيضًا أن تشاهد
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));