Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Elevation and border radius do not work well with opacity from Android 9 #25093

Open
d4rky-pl opened this issue May 30, 2019 · 28 comments
Open
Labels
Bug Help Wanted :octocat: Issues ideal for external contributors. Platform: Android Android applications.

Comments

@d4rky-pl
Copy link

d4rky-pl commented May 30, 2019

The way elevation works is that it creates a border around the element that is then shifted to the bottom. The background color of the element then hides the inside part of the border.

When we apply border radius to the same element, the border gets thicker to accommodate for the increased radius. So far so good.

Unfortunately if we then apply the opacity to the parent, the background color of the element gets semitransparent, making the border visible and creating an ugly effect.

Screenshot_2019-05-30-17-03-34-477_host exp exponent

React Native version: 0.57
Expo SDK 32
Android version: 9.0

Steps To Reproduce

Create an element and apply, elevation, border radius and background color. Then apply opacity on its parent.

Describe what you expected to happen:

The border underneath the element should not leak out

Snack, code example, or link to a repository:

https://snack.expo.io/SJDAlu6TV

@d4rky-pl d4rky-pl added the Bug label May 30, 2019
@ferrannp
Copy link
Contributor

I think this is related to #23090 and react-navigation/react-navigation#5535.

@lukewalczak
Copy link
Contributor

Seems like the issue is reproducible only on Android version 9.0 (I was testing that bug also on Android version 7.0 and 8.1 where it looks properly).

@ferrannp ferrannp changed the title Elevation and border radius do not work well with opacity Elevation and border radius do not work well with opacity from Android 9 May 30, 2019
@react-native-bot react-native-bot added the Platform: Android Android applications. label May 30, 2019
@seriiix
Copy link

seriiix commented Jun 1, 2019

Facing this issue with RN 0.59.8 as well.

@PierreCapo
Copy link

Tested on 0.59.9 and got the same problem as well. That makes the app really ugly on Android 9

@NicholasBertazzonAga
Copy link

Still facing the issue on RN 0.60.4

@ivosousaa
Copy link

Still happening for me too, and have not found a workaround yet either.

@sergchernata
Copy link

Still an issue.

@WickedBrat
Copy link

Using backgroundColor: '#fff' sets it right and works as expected.

@yunjeongloper
Copy link

Still not work well.

@Sofianio
Copy link

Sofianio commented Dec 5, 2019

I'm having the same issue with RN 0.61.4 ... no possible fix or workaround?

PS: I got the issue on Android 7.1.1 as well as Android 9

@toro705
Copy link

toro705 commented Dec 5, 2019

Having the same problem, when fading out with opacity, the back shadow looks unaceptable. Any updates on this?

@se09deluca
Copy link

Hi there! Same issue, look at this:
elev_error
It looks good on a 5.5" display with Android Pie. Instead on a 6.67" display with Android Q it looks like in the image.

Style props:

{
        width: 70, height: 70,
        flexDirection: "row", justifyContent: "center", alignItems: "center",
        backgroundColor: "#10aaae",
        borderStyle: "solid",
        borderRadius: 50,
        borderWidth: 7,
        borderColor: "rgba(16, 170, 174, 0.2)",
        elevation: 10,
        shadowColor: "#10aaae",
        shadowRadius: 7,
        shadowOpacity: .5,
        shadowOffset : { width: 0, height: 10 }
}

Hope it could help in resolving! 🤞🏻

@Theng
Copy link

Theng commented Feb 6, 2020

@ferrannp hello sir, is there anyways to make this bug more priority. I am waiting for this too long sir.

@BlueFits
Copy link

Using backgroundColor: '#fff' sets it right and works as expected.

worked for me, what happened was my component was transparent hence i can see whats happening in the back, setting a background color makes it work as intended

@sergchernata
Copy link

Using backgroundColor: '#fff' sets it right and works as expected.

worked for me, what happened was my component was transparent hence i can see whats happening in the back, setting a background color makes it work as intended

The problem is that if you lower or animate the opacity of this element, fading it out, the background color doesn't help. You can still see the shadow being rendered underneath, like a thick border.

@simongoot
Copy link

simongoot commented Sep 17, 2020

I found that this problem occur when changing opacity on a wrapping element that contain child elements using elevation for shadow.
What fixed this bug for me temporarily was to set flag needsOffscreenAlphaCompositing on the wrapping element that i animated opacity style prop for. (For best practice usage check: https://reactnative.dev/docs/view#needsoffscreenalphacompositing) Otherwise setting opacity on each of the child elements should also work, instead of only the parent wrapper.

This was mentioned here: #23090 (comment)

@kesha-antonov
Copy link
Contributor

I have a function that resizes px size based on a device's width.
In my cases it rounded 21.09 to 21.090909...
Passing 21 to wrapping element fixed issue with shadow

@stevenelkhaldi
Copy link

What helped me when I wanted a wrapping element to have opacity and its children to have shadow and elevation while removing the buggy effect of seeing the border is that instead of applying the opacity through the opacity key (e.g., opacity: 0.7), I applied it through backgroundColor (e.g., '#FFFFFFB2'). This got rid of the effect for me.

@ccfz
Copy link

ccfz commented Mar 3, 2021

Using @simongoot solution, needsOffscreenAlphaCompositing worked great. In case someone else has the problem with a TouchableOpacity, where needsOffscreenAlphaCompositing did not work for me. You can replace the TouchableOpacity with an Animated Presseable and then animate the opacity via onPressIn and onPressOut.

import { Pressable, Animated } from 'react-native';
const AnimatedPressable = Animated.createAnimatedComponent(Pressable);

const Button = ({children}) => {
  const animatedButtonOpacity = useRef(new Animated.Value(1));
  
  const buttonOpacity = {
    opacity: animatedButtonOpacity.current
  };
  return (
    <>
      {properties.map((property, index) => (
        <AnimatedPressable
          onPressIn={() => animatedButtonOpacity.current.setValue(0.5)}
          onPressOut={() => animatedButtonOpacity.current.setValue(1)}
          onPres={...}
          style={buttonOpacity}
          needsOffscreenAlphaCompositing
        >
          {children}
        </AnimatedPressable>
      ))}
    </>
  );
};

@danielolamide
Copy link

Seems like needsOffscreenAlphaCompositing isn't working for me. Anyone else encountered and sorted this?

@fellenabmb
Copy link

Seems like needsOffscreenAlphaCompositing isn't working for me. Anyone else encountered and sorted this?

Encountered, yes. Sorted, no. This is still a thing.
Basically, I have an Animated.View with shadows (elevation in Android and shadows in iOS, that is) in a sort-of card component that I re-use a lot in my app.
On iOS it works just fine, but on android, the view with elevation doesn't like opacity at all. That is, TouchableOpacity (touchables with a shadow) or animations regarding opacity.

So my guess is, this issue is still going on. Currently running the latest RN version, I might add.

@louielyl
Copy link

louielyl commented Oct 1, 2021

I discovered a simple way to fix the problem, which is adding an opacity property to the child component to overide the effect done by the parent element, such as opacity: 0.99;, see if it works for you.

@LarsDepuydt
Copy link

LarsDepuydt commented Nov 19, 2021

I discovered a simple way to fix the problem, which is adding an opacity property to the child component to overide the effect done by the parent element, such as opacity: 0.99;, see if it works for you.

This does not work for me, is there already another fix?
(Expect from using two View components (one for shadow and one for the background color with opacity))

@aprilmintacpineda
Copy link

Setting backgroundColor: '#fff' works.

@mmkhmk
Copy link

mmkhmk commented May 12, 2023

Any updates? I'm facing the same issue, and either backgroundColor: #fff or opacity: 0.99 worked for me.

@mathbalduino
Copy link

Still buggy...

@fabOnReact
Copy link
Contributor

Workaround was published here. Do you believe it worth fixing this issue in react-native?

@fazal26
Copy link

fazal26 commented Apr 2, 2024

still facing issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Help Wanted :octocat: Issues ideal for external contributors. Platform: Android Android applications.
Projects
None yet
Development

No branches or pull requests