Ich habe ein quadratisches Bild (obwohl dieses Problem auch für rechteckige Bilder gilt). Ich möchte das Bild so groß wie möglich darstellen und es gegebenenfalls dehnen, um die Eltern zu füllen, während das Seitenverhältnis beibehalten wird. Das Bild ist kleiner als die Bildansicht. Das Problem ist, ich kann das Bild nicht strecken und die Höhe und Breite der Bildansicht "anpassen".
Dies ist meine XML-Layoutdatei:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:padding="10dp">
<ImageView Android:id="@+id/image"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:adjustViewBounds="true"
Android:scaleType="fitCenter"
Android:layout_marginTop="10dp"/>
<TextView Android:id="@+id/name"
Android:layout_below="@id/image"
Android:layout_alignLeft="@id/image"
Android:layout_marginTop="20dp"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="18dp"/>
<TextView Android:id="@+id/name2"
Android:layout_below="@id/name"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="14dp"/>
</RelativeLayout>
Ich habe viele Kombinationen von fill_parent
, wrap_content
mit mehreren scaleTypes verwendet: fitCenter
, fitStart
, fitEnd
, centerInside
, und alle zeichnen die Bilder im richtigen Seitenverhältnis, aber Keines der Bilder skaliert tatsächlich und das ImageView selbst Dies hat zur Folge, dass entweder die TextViews ganz nach unten vom Bildschirm geschoben werden, Leerzeichen in der ImageView, ein nicht skaliertes Bild oder ein abgeschnittenes Bild.
Ich kann nicht genau die richtige Kombination dafür finden.
Diese:
Android:layout_height="wrap_content"
Android:scaleType="fitStart"
Android:adjustViewBounds="true"
sollte die Größe des Bildes ändern und die Größe der Begrenzungen an die neue Bildgröße anpassen. Wenn dies nicht auf Ihrem Gerät erfolgt, geben Sie das von Ihnen verwendete Image und das Gerät an, auf dem Sie testen.
Verwenden Sie diesen Code: Android:scaleType="fitXY"
Weitere Informationen zur Bildskalierung finden Sie in diesem Artikel hier
Zusammenfassung:
center
Zentrieren Sie das Bild in der Ansicht, führen Sie jedoch keine Skalierung durch
centerCrop
Skalieren Sie das Bild einheitlich (behalten Sie das Seitenverhältnis des Bildes bei), so dass beide Abmessungen (Breite und Höhe) des Bildes gleich oder größer als die entsprechende Abmessung der Ansicht sind (minus Auffüllen). Das Bild wird dann in der Ansicht zentriert
centerInside
Skalieren Sie das Bild gleichmäßig (behalten Sie das Seitenverhältnis des Bildes bei), so dass beide Abmessungen (Breite und Höhe) des Bildes gleich oder kleiner als die entsprechende Abmessung der Ansicht sind (minus Auffüllen).
fitCenter
fitEnd
fitStart
fitXY
matrix
Skalieren Sie beim Zeichnen mit der Bildmatrix
weitere Details hier neuer Artikel
Verwenden Sie diesen Code mit Ansichtslayout-Parametern als wrap_content
Android: adjustViewBounds = "true"
Hoffe das es klappt.
Dieser XML-Code wird funktionieren! Wenn Sie angeben, dass die Breite Ihrer Apps immer der des Fensters entspricht, legt Android:adjustViewBounds="true"
die Höhe entsprechend dem Bildverhältnis fest.
<ImageView
Android:adjustViewBounds="true"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:src="@drawable/screen"/>
Ich hatte das gleiche Problem, Android: adjustViewBounds erledigt seine Arbeit nicht und hat eine Füllung oben im Bild. In einem relativen Layout mit übereinstimmenden Werten für die Breite und Höhe hatte ich:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical" Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/transparent">
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:scaleType="fitStart"
Android:adjustViewBounds="true" ...
Ich habe das relative Layout in ein lineares Layout mit wrap_content-Werten für Breite und Höhe geändert. Jetzt ist es in Ordnung:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Haben Sie versucht, es programmgesteuert anzupassen? Ich denke, es funktioniert wirklich gut, wenn Sie die Höhe Ihres TextView
s berechnen und die Höhe und Breite des Bildes auf dieser Basis anpassen.
private void adjustImageView()
{
//Get the display dimensions
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//TextView name
TextView name = (TextView) findViewById(R.id.name);
name.setText("your name text goes here");
name.measure(0, 0);
//name TextView height
int nameH = name.getMeasuredHeight();
//TextView name2
TextView name2 = (TextView) findViewById(R.id.name2);
name2.setText("your name2 text goes here");
name2.measure(0, 0);
//name2 TextView height
int name2H = name2.getMeasuredHeight();
//Original image
Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image);
//Width/Height ratio of your image
float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight();
//Calculate the new width and height of the image to display
int imageToShowHeight = metrics.heightPixels - nameH - name2H;
int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight);
//Adjust the image width and height if bigger than screen
if(imageToShowWidth > metrics.widthPixels)
{
imageToShowWidth = metrics.widthPixels;
imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);
}
//Create the new image to be shown using the new dimensions
Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true);
//Show the image in the ImageView
ImageView image = (ImageView) findViewById(R.id.image);
image.setImageBitmap(imageToShow);
}
Legen Sie Android:layout_height="wrap_content"
in der Bildansicht ..__ fest. Um ein Bild zu erstellen, dessen Breite der Bildschirmbreite entspricht und die Höhe entsprechend dem Seitenverhältnis eingestellt ist, gehen Sie wie folgt vor. Hier erwähne ich, wie man Image von URL zu Imageview lädt.
Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
// creating the image that maintain aspect ratio with width of image is set to screenwidth.
int width = imageView.getMeasuredWidth();
int diw = resource.getWidth();
if (diw > 0) {
int height = 0;
height = width * resource.getHeight() / diw;
resource = Bitmap.createScaledBitmap(resource, width, height, false);
}
imageView.setImageBitmap(resource);
}
});
Hoffe das hilft.