web-dev-qa-db-fra.com

Android dispositions et redimensionnement automatique de l'image

Mon Android a actuellement deux dispositions pour son écran de démarrage, portrait et paysage. Les deux utilisent le même format simple - une image de la même taille que l'écran, maintenue dans une disposition linéaire simple:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:orientation="vertical"
   Android:layout_width="fill_parent"
   Android:layout_height="fill_parent"
   >
<ImageView
       Android:layout_width="fill_parent"
       Android:layout_height="fill_parent"
       Android:scaleType="fitCenter"
        Android:src="@drawable/splash_p"
       />
</LinearLayout>

L'image utilisée est de 320 lx 480 h et Android la redimensionne automatiquement pour l'adapter à l'écran, quelle que soit la taille d'écran de l'appareil. De toute évidence, l'image n'est pas aussi nette lorsqu'elle est redimensionnée pour une tablette pour exemple.

Je dois souligner ici que mon objectif est de réduire autant que possible la taille installée de l'application finale, et je suis conscient que je pourrais inclure différentes dispositions et tailles des mêmes images pour chaque taille d'écran différente.

Mon écran de démarrage est composé du nom de l'application dans le tiers supérieur de l'écran, puis d'une image dans les deux tiers inférieurs de l'écran. Afin d'économiser de la mémoire, je souhaite rogner le nom de l'application et l'image en deux images distinctes, puis les afficher dans une disposition verticale linéaire pour les appareils tenus en mode portrait. J'utiliserai ensuite une disposition horizontale linéaire de l'image, puis le nom de l'application pour le mode paysage.

Pour la mise en page du portrait, j'ai ceci:

     <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:orientation="vertical">
        <LinearLayout Android:id="@+id/linearLayout1" Android:layout_width="fill_parent"            Android:layout_height="wrap_content" Android:orientation="vertical">
        <View Android:layout_height="45dp" Android:layout_width="45dp" />   
        <ImageView Android:layout_height="fill_parent" 
        Android:src="@drawable/splashtext" 
        Android:scaleType="fitCenter" 
        Android:layout_gravity="center" 
        Android:layout_width="fill_parent"></ImageView>

        <View
        Android:layout_height="35dp"
        Android:layout_width="35dp" />      

       <ImageView
       Android:scaleType="fitCenter"
        Android:src="@drawable/splashpic"
       Android:layout_height="fill_parent" Android:scaleType="fitCenter" Android:layout_width="fill_parent" Android:layout_gravity="center"/>
</LinearLayout>
</LinearLayout>

Lorsque j'affiche ce qui précède dans Eclipse, cela semble correct pour les téléphones intelligents, mais les images ne sont pas agrandies lorsqu'elles sont affichées sur une tablette, bien que j'utilise l'argument Android: scaleType = "fitCenter". J'ai essayé d'utiliser des trempettes au lieu de fill_parent dans l'imageview layout_width et layout_height mais cela ne fonctionne pas non plus.

Qu'est-ce que je fais mal? Y a-t-il une autre façon de procéder?

Merci

J'ai édité la question pour inclure ce XML révisé basé sur l'aide de @ KaHa6u ci-dessous. Alors maintenant, j'ai:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:layout_width="fill_parent"
   Android:layout_height="fill_parent" 
   Android:orientation="vertical">
    <LinearLayout Android:id="@+id/linearLayout1" 
    Android:layout_width="fill_parent" 
    Android:layout_height="fill_parent" 
    Android:orientation="vertical">
<View
        Android:layout_height="15dp"
        Android:layout_width="15dp"
 /> 
<ImageView Android:layout_height="wrap_content" 
        Android:src="@drawable/splashtext" 
        Android:adjustViewBounds="true"
        Android:scaleType="fitXY" 
        Android:layout_gravity="center" 
        Android:layout_width="wrap_content" 
        Android:layout_weight="1">
        </ImageView>


<View
        Android:layout_height="15dp"
        Android:layout_width="15dp"
 /> 
<ImageView
       Android:scaleType="fitXY"
       Android:src="@drawable/splashpic" 
       Android:adjustViewBounds="false"
       Android:layout_height="wrap_content" 
       Android:layout_width="wrap_content" 
       Android:layout_weight="4" 
       Android:layout_gravity="center"/>
</LinearLayout>
</LinearLayout>

Ce qui évolue verticalement, mais pas horizontalement, donc je me retrouve avec de grandes images minces lorsque la taille de l'écran augmente.

13
basinbasin

@basinbasin

Je viens de rencontrer une situation très similaire à celle que vous avez expliquée. J'avais besoin d'une ImageView au-dessus de la mise en page, qui devait être étirée UNIQUEMENT HORIZONTALEMENT et conserver sa hauteur lorsque le téléphone était en orientation paysage. J'ai réussi avec ça:

<ImageView
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:src="@drawable/main_header"
    Android:scaleType="fitXY"
/>

et, bien sûr, avec l'attribut d'activité:

<activity Android:configChanges="keyboardHidden|orientation">

J'espère que cela t'aides. Je vous remercie.

15
KaHa6uc

Le fitCenter scaleType conserve le rapport hauteur/largeur d'origine. Avez-vous essayé le scaleType fitXY? Documentation Matrix.ScaleToFit

1
KaHa6uc

Avez-vous essayé "fill_parent" comme valeurs Android: layout_height et Android: layout_width pour l'image que vous souhaitez étirer? Je suppose que le paramètre "wrap_content" ne permet pas au système de connaître les limites auxquelles redimensionner l'image. Veuillez essayer et faites-moi part des résultats.

0
KaHa6uc