imatge full-screen

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

imatge full-screen

David Regordosa
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

--
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 [hidden email].
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: imatge full-screen

Roc Boronat-2
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 :·)




El dia 10 febrer de 2015, 9:59, David Regordosa <[hidden email]> ha escrit:
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

--
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 [hidden email].
For more options, visit https://groups.google.com/d/optout.

--
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 [hidden email].
For more options, visit https://groups.google.com/d/optout.