Elevation not working for ImageView
Asked Answered
R

8

40

Elevation for ImageView is not working. I declared ImageView in XML like this:

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

What else should I do for elevation to work properly for ImageView?

Rowboat answered 4/6, 2015 at 9:57 Comment(3)
it's working fine right?what is the problem?Swell
edit your question with full xml file.Swell
For any view android:elevation will apply only if the view has a android:background appliedErrant
E
43

The elevation shadow is derived from the background drawable of a View. If your ImageView has no background, you'll see no shadow.

If you want to change that behavior, you need to build your own ViewOutlineProvider and call View.setOutlineProvider() to set it (and this is not trivial).

Erector answered 4/6, 2015 at 10:14 Comment(8)
So, you can just add a background too.Meldon
@BladeCoder, What value need to set in outlineProvider, Is it background, bounds, paddedBounds or noneDwain
@Naveen Kumar M None, you need to extend the ViewOutlineProvider class and override the getOutline() method.Erector
@BladeCoder, Okay Thanks!Dwain
Of course if you just want the shadow to fill the whole view, you can use BOUNDS or PADDED_BOUNDS.Erector
Applying android:outlineProvider="bounds" is enough to see the shadow.Nevile
@Erector would you please share some example how to add shadow effect to imageView , when background drawable set to imageView .Davidson
Let me recap: - If you want the shadow to follow the bounds of a translucent image, you need to set the image as background or provide a custom ViewOutlineProvider in code. - If your image is fully opaque and has the same shape as your ImageView (rectangular), then you can use android:outlineProvider="bounds"Erector
F
16

For displaying a round Image with SHADOW with elevation attribute, I created a round drawable WITHOUT SHADOW as shown below :

<?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>

Use this drawable as background in your ImageView as shown below :

    <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" />

This will display ImageView with shadow.

One question that might be arising in your mind is why to use xml drawable. As mentioned by other developers on various answers to this question, shadow is formed from background and a bordered background to be more specific. Xml drawable helps us in creating a bordered background from which elevation attribute can create shadow.

Fanjet answered 29/12, 2017 at 6:43 Comment(1)
Thank you, this was the only solution that worked for meGodparent
T
12

Works in all latest versions

Use CardView as parent layout. Use android:background="@drawable/your_img" instead of android:src="@drawable/your_img" in 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>
Terrorize answered 10/2, 2017 at 10:45 Comment(3)
what if image is circle ?Plastered
if the image is a circle and if you know the radius of the image, you can set app:cardCornerRadius to that value.Prophetic
This produces a nasty bug in some Android 6 devices. The image is drawn in two steps: first, the image is drawn as a square and then it flickers and the image appears inside the CardView. And while you leave the screen, the CardView is lost and you see the image as a square again as soon as you press the back button. My solution was to use Glide to make the image round and then apply a circular background, as @Tarun specifies in the answer below.Monopoly
N
9

As an addition to the clarification of BladeCoder's answer: applying android:outlineProvider="bounds" to the ImageView will result in the shadow to be displayed.

Nevile answered 1/5, 2019 at 22:46 Comment(1)
simple and easy. thanksTarnopol
P
3

If you are using CardView, be sure to leave the CardView background 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>
Pelecypod answered 23/12, 2017 at 14:18 Comment(0)
B
2

The elevation attribute will be simply ignored if your minSdk version is less than 21. Either change that or try the method explained over here https://mcmap.net/q/408138/-place-imageview-over-button-android

enter image description here

Behind answered 12/12, 2019 at 17:38 Comment(0)
P
0

On Lollipop it works setting elevation. For pre-Lollipop, you need to implement shadows by yourself. Support-v4 has ViewCompat.setElevation(view, value) method for by if you check the sources there is no implementation. (at least, at the time of writing).

Phosphorism answered 4/6, 2015 at 10:18 Comment(0)
B
0

Instead of using android:src you need to change to android:background for displaying shadows.

 <ImageView
    android:id="@+id/image"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:elevation="10dp"
    android:background="@drawable/youtube" />
Broadfaced answered 11/8, 2015 at 7:19 Comment(1)
How come I don't see any shadow? Tested on 5.1.1, with wrap_content for both width and height, and I've even tried android:outlineProvider="background" . Nothing shows elevation on the imageView's content.Garnishment

© 2022 - 2024 — McMap. All rights reserved.