web-dev-qa-db-fra.com

L'élévation ne fonctionne pas pour ImageView

L'élévation pour ImageView ne fonctionne pas. J'ai déclaré ImageView en XML comme ceci:

<ImageView
        Android:id="@+id/image"
        Android:layout_width="100dp"
        Android:layout_height="50dp"
        Android:elevation="10dp"
        Android:src="@drawable/youtube" />

Que dois-je faire d'autre pour que l'élévation fonctionne correctement pour ImageView?

26
Karthik

L'ombre d'élévation est dérivée de l'arrière-plan dessinable d'une vue. Si votre ImageView n'a pas d'arrière-plan, vous ne verrez aucune ombre.

Si vous souhaitez modifier ce comportement, vous devez créer votre propre ViewOutlineProvider et appeler View.setOutlineProvider() pour le définir (et ce n'est pas anodin).

26
BladeCoder

Fonctionne dans toutes les dernières versions

tilisez CardView comme disposition parent. Utilisez Android:background="@drawable/your_img" au lieu de Android:src="@drawable/your_img" dans ImageView.

<Android.support.v7.widget.CardView
    Android:layout_gravity="center_horizontal"        
    app:cardElevation="5dp"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">

    <ImageView       
        Android:id="@+id/image"
        Android:background="@drawable/your_img"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:contentDescription="@null" />

</Android.support.v7.widget.CardView>
9
Shyam Kumar

Si vous utilisez CardView, veillez à laisser l'arrière-plan de CardView transparent.

<Android.support.v7.widget.CardView
                Android:layout_gravity="center_horizontal"
                app:cardElevation="@dimen/cardview_default_elevation"
                app:cardBackgroundColor="@Android:color/transparent"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content">
<ImageView
        Android:id="@+id/image"
        Android:layout_width="100dp"
        Android:layout_height="50dp"
        Android:src="@drawable/youtube" />

</Android.support.v7.widget.CardView>
2
Joiner Sá

Pour afficher une image ronde avec SHADOW avec attribut d'élévation, j'ai créé un rond dessinable SANS OMBRE comme indiqué ci-dessous:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item>
        <shape Android:shape="oval">
            <solid Android:color="@Android:color/white" />
        </shape>
    </item>

</layer-list>

Utilisez ce dessin comme arrière-plan dans votre ImageView comme indiqué ci-dessous:

    <ImageView
        Android:id="@+id/my_button"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="@drawable/round_shape"
        Android:elevation="5dp"
        Android:src="@drawable/center" />

Cela affichera ImageView avec une ombre.

Une question qui pourrait se poser dans votre esprit est de savoir pourquoi utiliser xml drawable. Comme mentionné par d'autres développeurs sur diverses réponses à cette question, l'ombre est formée à partir du fond et d'un fond bordé pour être plus spécifique. Le dessin Xml nous aide à créer un arrière-plan bordé à partir duquel l'attribut d'élévation peut créer une ombre.

2
Tarun

Au lieu d'utiliser Android: src, vous devez passer à Android: arrière-plan pour afficher les ombres.

 <ImageView
    Android:id="@+id/image"
    Android:layout_width="100dp"
    Android:layout_height="50dp"
    Android:elevation="10dp"
    Android:background="@drawable/youtube" />
1
Bhavin Shah

En complément de la clarification de réponse de BladeCoder : appliquer Android:outlineProvider="bounds" au ImageView entraînera l'affichage de l'ombre.

1
azizbekian

Sur Lollipop cela fonctionne en définissant l'altitude. Pour pre-Lollipop,, Vous devez implémenter vous-même les ombres. Support-v4 A la méthode ViewCompat.setElevation(view, value) pour by si vous vérifiez les sources il n'y a pas d'implémentation. (au moins, au moment de la rédaction).

0
mohammad rababah