imatge full-screen

0 views
Skip to first unread message

David Regordosa

unread,
Feb 10, 2015, 3:59:07 AM2/10/15
to catd...@googlegroups.com
Hola nois,

Una pregunta recurrent que se que s'ha tractat mil vegades i que podria perfectament estar en el top 3 de consultes a stack overflow.

Estic fent una app en la que hi ha una pantalla de login.
Els de marqueting han triat una imatge preciosa (una imatge que es molt mes ample que no pas alta) i volen que quedi tope xula ocupant tota la pantalla.

Ja coneixeu com van les coses. De cop, que la imatge aquesta es vegui tope xula a maximum resolution i amb mes ppt que la mona lisa, es prioritari :)
Assignar la imatge com a fondo de un layout, fa que aparegui deformada, perd l'aspect ratio rapid perqué en el cas d'un mobil precisament estariem intentant carregar una imatge que es mes ample que no pas alta en un dispositiu que es mes alt que no pas ample.

En fi, li he donat alguna volta i he arribat a la conclusió que el millor que es podria fer es:

- Sempre llegir la imatge amb la alçada total del dispositiu. Un cop tinc la imatge que te una alçada igual que la del dispositiu, calculo quina ha de ser l'amplada perque la imatge no es deformi. Un cop tinc aquesta imatge, faig un crop i retallo en amplada i mostro tot el que hi cap a la pantalla.

Crec que com a aproximació no mola gens, perqué clar, abans de fer el crop em trobo en la situació en que tinc en memoria una imatge molt gran (es molt gran perqué no la vull deformar), i per molt que la marqui com a recylce, en alguns mobils de gama petita, casca.

Com ho farieu? segur que es pot fer moooooooooolt mes simple. 

La funcioneta que tinc per a fer tot això es aquesta:


private void setImageBackground() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(this.getResources(), R.drawable.login_bg, options);
        int imageHeight = options.outHeight;
        int imageWidth = options.outWidth;

        int finalwidth;
        if (screenHeight > screenWidth) { //pantalla mes alta que no pas llarga
            double ratio = (double) screenHeight / (double) imageHeight;
            finalwidth = (int) (imageWidth * ratio);
            background_login.setImageBitmap(ThumbnailUtils.extractThumbnail(Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.login_bg), finalwidth, screenHeight, true), screenWidth, screenHeight, ThumbnailUtils.OPTIONS_RECYCLE_INPUT));
        } else {  //pantalla mes llarga que no pas alta
            double ratio = (double) screenHeight / (double) imageHeight;
            finalwidth = (int) (imageWidth * ratio);
            if (finalwidth < screenWidth) {
                background_login.setImageBitmap(ThumbnailUtils.extractThumbnail(BitmapFactory.decodeResource(this.getResources(), R.drawable.login_bg), screenWidth, screenHeight, ThumbnailUtils.OPTIONS_RECYCLE_INPUT));
            } else {
                background_login.setImageBitmap(ThumbnailUtils.extractThumbnail(Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.login_bg), finalwidth, screenHeight, true), screenWidth, screenHeight, ThumbnailUtils.OPTIONS_RECYCLE_INPUT));
            }
        }


    }


A notar: que per a fer el crop utilitzo ThumbnailUtils. El métode extractThumbnail sobre el paper te un ultim parametre que permet indicar que marqui com a recycled el bitmap "original" previ al crop.

Segurament m'estic liant, i estic fent alguna cosa que està més que resolta...pero ostia, el que mai entendré es que carregar una imatge de fons en un Android suposi devorar-se el 90% de la memoria heap. 
En fi, gracies gent!


--
----------------------------------------
David Regordosa

Roc Boronat

unread,
Feb 10, 2015, 4:17:52 AM2/10/15
to Catalonia Android Community Group
Bones!

Amb el perill de que no hagi entès la pregunta... per què no poses aquesta imatge dintre d'un ImageView, i a l'scaleType de l'ImageView el poses a centerCrop?


    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/login_background" />

OJO PELIGRU! Les imatges a pantalla completa, recomano que estiguin en totes les densitats: ldpi, mdpi, hdpi... perquè si només indiques xxxhdpi i xxhdpi, peligru quan els terminals petits hagin de fer el redimensionat. automàtic.

I ja està. Java 0 :·)




--
You received this message because you are subscribed to the Google Groups "Catalonia Android Community Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to CatDroid+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages