Ich lade das Bild herunter und setze es dynamisch als Bildschirmhintergrund mit Imageview
. Ich habe versucht ScaleType
, das Bild zu skalieren.
Wenn die Bildhöhe ist größer als die Breite dann ScaleTypes
fitStart
, fitEnd
und fitCenter
do n't Arbeit. Android verkleinert das Foto und passt es an die Höhe an, aber ich sehe zusätzliche Leerzeichen als Teil der Breite.
Ich möchte das Foto basierend auf der Breite verkleinern, damit es zur Breite passt, und es ist mir egal, ob es als Teil der Höhe einen zusätzlichen Leerraum gibt oder ob die Höhe zu lang ist, ist es in Ordnung, wenn es aus der Ansicht verschwindet (Wenn das möglich ist?).
ScaleType.XY
Skalieren Sie das Foto und passen Sie alles in das ImageView
Verhältnis von Bildgröße und -gewicht ein.
<ImageView
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="fitStart"
/>
"fitCenter"
statt"centerFit"
.android:adjustViewBounds="true"
macht den Job!quelle
Diese elegante Lösung, die Sie hier finden , wird für Sie wie ein Zauber wirken.
Grundsätzlich müssen Sie nur eine kleine Klasse erstellen,
ImageView
die dieonMeasure
Methode erweitert und einfach überschreibt , um die Breite und Höhe nach Ihren Wünschen anzupassen. Hier skaliert es mit:@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth(); setMeasuredDimension(width, height); }
Sie würden dieses Special
ImageView
wie folgt verwenden:<your.activity.package.AspectRatioImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_vertical" android:src="@drawable/test" />
quelle
Es gibt eine einfache Methode, wenn Sie einfach die Breite des Bildschirms ausfüllen und die Höhe proportional haben möchten (und das Verhältnis des Bildes kennen). Dies können Sie in OnCreate () tun:
setContentView(R.layout.truppview_activity); trupImage = (ImageView) findViewById(R.id.trupImage); Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics outMetrics = new DisplayMetrics(); display.getMetrics(outMetrics); float scWidth = outMetrics.widthPixels; trupImage.getLayoutParams().width = (int) scWidth; trupImage.getLayoutParams().height = (int) (scWidth * 0.6f);
Wobei 0,6 die Verhältnisanpassung ist (Sie können natürlich auch automatisch berechnen, wenn Sie das W & H des Bildes kennen).
PS:
Hier ist die XML-Seite:
<ImageView android:id="@+id/trupImage" android:layout_width="match_parent" android:background="@color/orange" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="fitCenter" />
quelle
Das funktioniert bei mir.
Eine Klasse erstellen erweitert ImageView
package com.yourdomain.utils; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; public class ResizableImageView extends ImageView { public ResizableImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Drawable d = getDrawable(); if (d != null) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth()); setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } }
Verwenden Sie in XML anstelle von ImageView Folgendes
<com.yourdomain.utils.ResizableImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/test" />
quelle
Ich denke, Sie können es nicht nur mit XML tun, Sie müssen Ihre Größe ändern, die Bitmap
Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); try { ((ImageView) findViewById(R.id.background)) .setImageBitmap(ShrinkBitmap(width)); } catch (FileNotFoundException e) { e.printStackTrace(); }
dann
private Bitmap ShrinkBitmap(int width) throws FileNotFoundException { BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); bmpFactoryOptions.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, bmpFactoryOptions); int widthRatio = (int) android.util.FloatMath .ceil(bmpFactoryOptions.outWidth / (float) width); bmpFactoryOptions.inSampleSize = widthRatio; if (bmpFactoryOptions.inSampleSize <= 0) bmpFactoryOptions.inSampleSize = 0; bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; bmpFactoryOptions.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, bmpFactoryOptions); return bitmap; }
Und das Layout
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="wrap_content" android:layout_height="wrap_content" />
quelle
Wenn Sie den gesamten übergeordneten Block des Bildes anpassen möchten, wird das Bild
gestreckt
android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY"
Und wenn Sie das gesamte übergeordnete Bild mit dem ursprünglichen Bildverhältnis anpassen möchten,
wird ein Teil des Bildes ausgeschnitten
android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="centerCrop"
quelle