WindowManager with Animation (is it possible?)

15,308

I'm not sure about exact requirements for Your task, but there's two ways to provide animation to window:

  1. Use WindowManager.LayoutParams.windowAnimations like the following:

    params.windowAnimations = android.R.style.Animation_Translucent;
    
  2. Add additonal 'container' view, because WindowManager is not a real ViewGroup and so normal animation for adding views is not working with it. This question has been asked already, however it lacks the code. I would apply it the following way:

    public class BannerLayout extends View {
    
        private final Context mContext;
    
        private final ViewGroup mPopupLayout;
    
        private final ViewGroup mParentView;
    
        public BannerLayout(Activity activity, final Context context) {
            super(context);
    
            mContext = context;
    
            final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
                            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                    PixelFormat.TRANSLUCENT);
    
            final WindowManager mWinManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            mPopupLayout = (RelativeLayout) inflater.inflate(R.layout.popup_activity, null);
            mPopupLayout.setVisibility(GONE);
    
            params.width = ActionBar.LayoutParams.WRAP_CONTENT;
            params.height = ActionBar.LayoutParams.WRAP_CONTENT;
    
            // Default variant
            // params.windowAnimations = android.R.style.Animation_Translucent;
    
            mParentView = new FrameLayout(mContext);
    
            mWinManager.addView(mParentView, params);
    
            mParentView.addView(mPopupLayout);
            mPopupLayout.setVisibility(GONE);
        }
    
        /**
         * Shows view
         */
        public void show(){
            final Animation in = AnimationUtils.loadAnimation(this.mContext, android.R.anim.fade_in);
    
            in.setDuration(2000);
    
            mPopupLayout.setVisibility(VISIBLE);
            mPopupLayout.startAnimation(in);
        }
    
        /**
         * Hides view
         */
        public void hide() {
            mPopupLayout.setVisibility(GONE);
        }
    }
    
Share:
15,308

Related videos on Youtube

LeandroPortnoy
Author by

LeandroPortnoy

Updated on June 04, 2022

Comments

  • LeandroPortnoy
    LeandroPortnoy over 1 year

    Is there any way to inflate a view with WindowManager using Animation (at android's project)? I just can't do it even using the examples in sites! I used many examples but none worked!

    public BannerLayout(Activity activity, final Context context) {
        super(context);
    
        this.context = context;
    
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams( 
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT); 
    
        wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);    
    
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        this.popupLayout = (RelativeLayout) inflater.inflate(R.layout.popup_activity, null);
        this.popupLayout.setVisibility(GONE);
        this.setActive(false);
    
        wm.addView(this.popupLayout, params);
    
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    
    
    private void show(){
        Animation in = AnimationUtils.loadAnimation(this.context, android.R.anim.fade_in);
        this.popupLayout.setAnimation(in);
    
        this.setActive(true);
        this.popupLayout.setVisibility(VISIBLE);
    }
    
  • LeandroPortnoy
    LeandroPortnoy over 10 years
    sandrstar... worked perfectly! however... I wonder if it's possible using animation translation with these components. I need to make an effect up and down the screen with this component...
  • LeandroPortnoy
    LeandroPortnoy over 10 years
    private void show(){ //Animation fadeIn = (Animation) AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in); //this.startAnimation(fadeIn); //this.bannerRelativeLayout.setVisibility(VISIBLE); this.setActive(true); mPopupLayout.setVisibility(VISIBLE); final Animation in = new TranslateAnimation(0, 0, -1000, 0 ); in.setDuration(700); AnimationSet animation = new AnimationSet(false); animation.addAnimation(in); mPopupLayout.startAnimation(animation); }
  • sandrstar
    sandrstar over 10 years
    Sorry for delay. I've tried it and seems it works fine. May be You need to use params.width = ViewGroup.LayoutParams.MATCH_PARENT; params.height = ViewGroup.LayoutParams.MATCH_PARENT; for FrameLayout.
  • Hoa Vu
    Hoa Vu almost 9 years
    @sandrstar Could you take a look at this question about WindowManager? Thank you stackoverflow.com/questions/27937250/…
  • Run
    Run over 2 years
    @sandrstar Why not animate the mParentView directly?
  • sandrstar
    sandrstar over 2 years
    @Run it'll look different than window animation
  • Run
    Run over 2 years
    @sandrstar what's the difference?
  • sandrstar
    sandrstar over 2 years
    @Run as far as I remember, it might be about background behavour