Tsuma-Shifu
Tsuma-Shifu

Reputation: 283

Set Alpha/Opacity of Layout

Is it possible to set and get the Alpha/Opacity of a Layout and all it's child views? I'm not talking about the background. Say a collection of Video Controls like Play, Pause and Progressbar in a Relative Layout.

I can use animation to fade in and out but wanted to know if there was a direct method I could use.

Upvotes: 20

Views: 18760

Answers (5)

vincent091
vincent091

Reputation: 2345

Sorry for my answer but if you want the alpha you can use the ViewCompat Class

ViewCompat.setAlpha(View view, float alpha)

ViewCompat is in the appcompat v4

Upvotes: 0

Firstborn
Firstborn

Reputation: 71

Now you can use ViewCompat.setAlpha(View, float) for this action.

Upvotes: 3

workingkills
workingkills

Reputation: 2716

Here is a method that works across all versions (thanks to @AlexOrlov):

@SuppressLint("NewApi")
public static void setAlpha(View view, float alpha)
{
    if (Build.VERSION.SDK_INT < 11)
    {
        final AlphaAnimation animation = new AlphaAnimation(alpha, alpha);
        animation.setDuration(0);
        animation.setFillAfter(true);
        view.startAnimation(animation);
    }
    else view.setAlpha(alpha);
}

Clearly, for API less than 11 if you can you should create a custom view that calls Canvas.saveLayerAlpha() before drawing its children (thanks to @RomainGuy).

Upvotes: 15

Alex Orlov
Alex Orlov

Reputation: 18107

You can set the alpha on the layout and it's children (or any other view for that matter) using AlphaAnimation with 0 duration and setFillAfter option.

Example:

AlphaAnimation alpha = new AlphaAnimation(0.5F, 0.5F);
alpha.setDuration(0); // Make animation instant
alpha.setFillAfter(true); // Tell it to persist after the animation ends
// And then on your layout
yourLayout.startAnimation(alpha);

You can use one animation for multiple components to save memory. And do reset() to use again, or clearAnimation() to drop alpha.

Though it looks crude and hacked it's actually a good way to set alpha on set ov views that doesn't take much memory or processor time.

Not sure about getting current alpha value though.

Upvotes: 60

Romain Guy
Romain Guy

Reputation: 98521

Alex's solution works but another way is to create a custom view that calls Canvas.saveLayerAlpha() before drawing its children. Note that in Android 3.0 there is a new View.setAlpha() API :)

Upvotes: 6

Related Questions