web-dev-qa-db-fra.com

Équivalent de ImageView scaleType 'centerCrop' en gravité pouvant être dessiné au format bitmap

J'ai créé une activité avec une image d'en-tête. Cette image d'en-tête est créée à l'origine dans le fichier XML de présentation de l'activité à l'aide d'un ImageView où scaleType est défini sur centerCrop. Cela fait ce que je veux, cela centre l’image, la découpe en mode portrait pour que tout soit affiché en mode paysage.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingTop="30dp"
    Android:paddingBottom="6dp"
    Android:paddingLeft="6dp"
    Android:paddingRight="6dp"
    Android:background="#919EAC"
    Android:orientation="vertical" >

<ImageView
    Android:id="@+id/header_image"
    Android:layout_width="match_parent"
    Android:layout_height="120dp"
    Android:contentDescription="@string/header_description"
    Android:scaleType="centerCrop"
    Android:src="@drawable/header" />

    .... <other views> ...

J'aimerais remplacer ceci par un fond pouvant être dessiné afin que je puisse utiliser l'espace d'image d'en-tête pour afficher des données, et cela me permet de ne pas répéter la même présentation dans les différentes activités.

Pour cette raison, j'ai créé un dessin que je peux consulter dans l'attribut Android: background:

    <layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
        <item>
            <shape Android:shape="rectangle" >
                <solid Android:color="#919EAC" />
            </shape>
        </item>
        <item>
            <bitmap 
                Android:antialias="true"
                Android:gravity="top|center_horizontal"
                Android:src="@drawable/header" />
        </item>
    </layer-list>

Ce dessin permet de définir l’arrière-plan coloré défini par la mise en page, ainsi qu’une image d’en-tête qui serait sinon incluse dans la mise en page en tant qu’imageView.

Cependant, mon image est maintenant mise à l'échelle, alors que j'aimerais qu'elle soit recadrée.

Vérification de la documentation Android, j'ai essayé d'autres modes de gravité tels que 

    Android:gravity="top|clip_horizontal"

Mais il semble toujours afficher/redimensionner différemment que la vue de l'image.

Quelle serait la définition correcte du fond pouvant être dessiné?

36
M. le Rutte

Pour recadrer une image bitmap dans le code, procédez comme suit:

public static Bitmap cropCenter(Bitmap bmp) {
    int dimension = Math.min(bmp.getWidth(), bmp.getHeight());
    return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension);
}

Je ne connais pas d'autre moyen de centrer une bitmap xml au centre de CenterCrop.

J'espère que ça aide quelqu'un.

J'ai trouvé cette solution à partir de cet article: Centre de culture Android de Bitmap

2
Arnold Balliu

J'ai résolu ce problème avec un décorateur qui conserve les proportions du dessin sous-jacent: https://Gist.github.com/rudchenkos/e33dc0d6669a61dde9d6548f6c3e0e7e

Malheureusement, il n'y a aucun moyen de l'appliquer à partir de XML, donc je le fais au tout début de mon activité de démarrage:

public class SplashActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final Drawable bg = getResources().getDrawable(R.drawable.screen);
        getWindow().setBackgroundDrawable(new CenterCropDrawable(bg));

        ...
    }
}

C'est à peu près équivalent à spécifier le dessin comme Android:windowBackground dans le thème d'activité.

2
Sergii Rudchenko

Je ne sais pas comment faire avec le fond. Vous pouvez essayer d'autres solutions si: 

1) La solution la plus simple pour afficher quelque chose au-dessus de l’image est de les placer tous les deux de manière à ce qu’ils se chevauchent. Par exemple, vous pouvez utiliser un RelativeLayout avec les dimensions de ImageView, ImageView est match_parent dans les deux dimensions et un TextView au centre.

2) Vous pouvez enregistrer Imageview dans une présentation différente, par exemple, header.xml, et l'utiliser par include header.xml partout où vous en avez besoin.

3) Si la mise en page à afficher au-dessus d’ImageView est identique partout, vous pouvez créer une mise en page personnalisée avec un ImageView et dire, un TextView au centre, et l’utiliser partout. Vous pouvez ensuite définir la chaîne TextView sur cette disposition personnalisée. Vous pouvez en savoir plus sur les mises en page personnalisées, elles sont faciles.

0
Raghubansh Mani