ImageView umple lățimea sau înălțimea părintelui, dar menține raportul de aspect

Am o imagine pătratică (deși această problemă se aplică și imaginilor dreptunghiulare). Vreau să afișez imaginea cât mai mare posibil, întinzându-i, dacă este necesar, să îmi umple părinții, menținând în același timp raportul de aspect. Imaginea este mai mică decât ImageView. Problema este că nu pot întinde imaginea și "potrivesc" înălțimea și lățimea imaginii.

Acesta este fișierul meu de aspect XML:

<?xml version="1.0" encoding="utf-8"?>


    

    

    



Am folosit mai multe combinații de fill_parent , wrap_content cu mai multe scaleTypes: fitCenter , fitStart , centerInside și toate trasează imaginile în raportul de aspect potrivit, dar niciuna dintre ele nu mărește efectiv imaginile în sus și ImageView în sine , rezultând fie TextView-urile sunt împinse complet în afara ecranului, spațiile goale din interiorul ImageView, imaginea nu este scalată sau imaginea tăiată.

Nu pot să găsesc combinația potrivită pentru asta.

36
încercați răspunsul dat aici: android imageview nu se scalarează cu imaginea sursă „> stackoverflow.com/questions/5355130/…
adăugat autor FoamyGuy, sursa
Ați încercat android: scaleType = "fitXY" ? Se întinde imaginea în funcție de lățimea și înălțimea pe care le atribuiți (adică nu respectă raportul de aspect).
adăugat autor Sufian, sursa
@Tim: Am setat deja adjustViewBounds = true . Ea nu a redimensionat cumva marginile ImageView.
adăugat autor garbagecollector, sursa
@slybloty Am multiple, dar afișăm o imagine. Ar fi trebuit să scriu mai bine această întrebare. Afișează o imagine.
adăugat autor garbagecollector, sursa
Nu. Cred că am ajuns la revizuirea aspectului. Deci, această întrebare rămâne deschisă.
adăugat autor garbagecollector, sursa
adăugat autor aleb, sursa
@DumpHole Ați rezolvat această problemă? Dacă da, cum?
adăugat autor slybloty, sursa
Aveți o singură imagine sau mai multe? V-ați gândit să folosiți un ScrollView ? Este înălțimea imaginii dvs. mai mare decât înălțimea ecranului? Dacă da, cum doriți ca aspectul dvs. să arate? Codul dvs. TextView , ar trebui să fie în stânga sau în partea inferioară a imaginii? Dacă doriți ca toate cele 3 vizualizări să se potrivească ecranului dvs., acestea ar trebui să aibă toate android: layout_height = "wrap_content" .
adăugat autor slybloty, sursa
puteți încerca acest răspuns: stackoverflow.com/questions/5554682/…
adăugat autor OriolJ, sursa

7 răspunsuri

Aceste:

android:layout_height="wrap_content"
android:scaleType="fitStart"
android:adjustViewBounds="true"

ar trebui să redimensionați imaginea și să schimbați dimensiunea marginilor pentru a se potrivi cu noua dimensiune a imaginii. Dacă nu face acest lucru pe dispozitivul dvs., postați imaginea pe care o utilizați și dispozitivul pe care îl testați.

90
adăugat
Știu că nu ar trebui să adăugăm asemenea fel de comentarii, dar ... Te rog!
adăugat autor Jona, sursa
prima dată când am folosit această soluție în imagini reciclerview este de lucru.Apoi am încărcat o imagine nouă și a verificat toate imaginile în reciclerview este acum working.Anyone știu de ce se întâmplă?
adăugat autor Stephen, sursa
@ Foam Guy va lucra acest lucru dacă am m obtinerea de imagini de la server?
adăugat autor Erum, sursa
@ Erum nu ar trebui să conteze de unde provenea imaginea.
adăugat autor FoamyGuy, sursa
Nu funcționează. Nu pot posta imaginile deoarece sunt proprietate, dar sunt doar PNG-uri standard de 128x128. Acest lucru se întâmplă și pe emulator. Deci, nu apar probleme specifice dispozitivului. Aceste imagini sunt mai mici decât ImageView. Cred că acolo e problema.
adăugat autor garbagecollector, sursa
adjustViewBounds nu este suficient, acesta "nu va mări dimensiunea imaginii dincolo de dimensiunile naturale ale traseului": stackoverflow.com/a/ 7732684/804479
adăugat autor aleb, sursa
a lucrat perfect pentru mine! Mulțumesc mult
adăugat autor X.X_Mass_Developer, sursa
Cred că soluția este de a utiliza scaleType = "centerCrop", dacă poți accepta imaginea care urmează să fie tăiată ...
adăugat autor Christophe Fondacci, sursa
FitXY funcționează în loc de fitStart, altfel este bine, mulțumesc
adăugat autor Prateek, sursa
A lucrat perfect pentru mine. Mulțumiri!
adăugat autor Hristova, sursa
a lucrat perfect, mulțumesc
adăugat autor Mario Naether, sursa

Use this code : android:scaleType="fitXY"

Pentru mai multe detalii despre scalarea imaginii, arătați ce este semnalat în acest articol aici

Rezumat:

  • centru

Centrarea imaginii în vizualizare, dar nu efectuați scalarea

enter image description here

  • centerCrop

Scalați imaginea uniform (mențineți raportul de aspect al imaginii) astfel încât ambele dimensiuni (lățimea și înălțimea) imaginii să fie egale sau mai mari decât dimensiunea corespunzătoare a vederii (minus padding). Imaginea este apoi centrat în vedere

enter image description here

  • centerInside

Scalați imaginea uniform (mențineți raportul de aspect al imaginii) astfel încât ambele dimensiuni (lățime și înălțime) ale imaginii să fie egale sau mai mici decât dimensiunea corespunzătoare a vederii (minus padding)

enter image description here

  • fitCenter

enter image description here

  • fitEnd

enter image description here

  • fitStart

enter image description here

  • fitXY

enter image description here

  • matrice

Scala folosind matricea imaginii în desen

enter image description here

more details here new article

43
adăugat
cel mai bun răspuns acum pot să le înțeleg pe toți
adăugat autor shady sherif, sursa
Am editat răspunsul meu pentru a acoperi toate cazurile :)
adăugat autor Context, sursa
Dacă ImageView.background = # 000000 veți vedea că ImageView ocupă spațiul de aspect parental;
adăugat autor Marcos Vasconcelos, sursa
De ce acest răspuns nu are niciun vot? Numai asta lucreaza pentru mine!
adăugat autor Nari Kim Shin, sursa
Afișarea tuturor cazurilor cu fiecare imagine a fost foarte util pentru mine. Mulțumiri!
adăugat autor BrokenBacon, sursa
Deoarece nu menține raportul de aspect al imaginii sursă. Vedeți aici .
adăugat autor Stephen Niedzielski, sursa

Utilizați acest cod cu parametrii aspectului de vizualizare ca wrap-up

android: adjustViewBounds = "true"

Sper că acest lucru va funcționa.

11
adăugat
adjustViewBounds nu este suficient, acesta "nu va mări dimensiunea imaginii dincolo de dimensiunile naturale ale traseului": stackoverflow.com/a/ 7732684/804479
adăugat autor aleb, sursa

Ați încercat să o ajustați programat? Cred că funcționează foarte bine dacă se calculează înălțimea TextView s și se ajustează înălțimea și lățimea imaginii bazate pe aceasta.

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);
}
3
adăugat

Am avut aceeași problemă, android: adjustViewBounds nu-și face treaba și are un padding în partea superioară a imaginii. Într-un aspect relativ care avea valori match_parent pentru lățimea și înălțimea, am avut:

   

   

Am schimbat aspectul relativ la un aspect liniar cu valori wrap_content pentru lățime și înălțime și acum este ok:

    
2
adăugat
După mai multe ore de căutări, am schimbat și RelativeLayout la LinearLayout. Dar în cazul meu nu a fost prezentat un ImageView.
adăugat autor CoolMind, sursa

Acest cod xml va funcționa !. Dacă specificați că lățimea aplicațiilor dvs. este întotdeauna aceeași cu cea a ferestrei, atunci android: adjustViewBounds = "true" va seta înălțimea corespunzătoare rației imaginii.

        
2
adăugat

Setați android: layout_height = "wrap_content" în imaginea de vizualizare. Pentru a crea o imagine cu o lățime egală cu lățimea ecranului și cu o înălțime proporțională stabilită în funcție de raportul de aspect, efectuați următoarele. Aici menționez cum să încărcați imaginea pentru a vizualiza imaginea de la url.

Glide.with(context).load(url).asBitmap().into(new SimpleTarget() {
                    @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);
                    }
                });

Sper că acest lucru vă ajută.

0
adăugat
Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md