WindowManager с анимацией (возможно ли?)

Есть ли способ раздуть представление с помощью WindowManager с помощью анимации (в проекте Android)? Я просто не могу это сделать, даже используя примеры на сайтах! Я использовал много примеров, но ни один не сработал!

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);
}

person LeandroPortnoy    schedule 19.07.2013    source источник


Ответы (2)


Я не уверен в точных требованиях для Вашей задачи, но есть два способа обеспечить анимацию окна:

  1. Используйте WindowManager.LayoutParams.windowAnimations следующим образом:

    params.windowAnimations = android.R.style.Animation_Translucent;
    
  2. Добавьте дополнительное представление «контейнер», потому что WindowManager не является настоящим ViewGroup, и поэтому обычная анимация для добавления представлений не работает с ним. Этот вопрос уже задавался, однако в нем отсутствует код. Я бы применил это следующим образом:

    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);
        }
    }
    
person sandrstar    schedule 20.07.2013
comment
sandrstar... сработало отлично! однако... Интересно, возможно ли использовать перевод анимации с этими компонентами. Мне нужно сделать эффект вверх и вниз по экрану с помощью этого компонента... - person LeandroPortnoy; 22.07.2013
comment
private void show(){ //Animation fadeIn = (Animation) AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in); //this.startAnimation(fadeIn); //this.bannerRelativeLayout.setVisibility(VISIBLE); это.setActive (истина); mPopupLayout.setVisibility (ВИДИМЫЙ); окончательная анимация в = new TranslateAnimation (0, 0, -1000, 0); in.setDuration (700); Анимация AnimationSet = новый AnimationSet(false); анимация.добавить анимацию (в); mPopupLayout.startAnimation(анимация); } - person LeandroPortnoy; 22.07.2013
comment
Извините за задержку. Я попробовал это, и кажется, что это работает нормально. Возможно, вам нужно использовать params.width = ViewGroup.LayoutParams.MATCH_PARENT; params.height = ViewGroup.LayoutParams.MATCH_PARENT; для FrameLayout. - person sandrstar; 23.07.2013
comment
@sandrstar Не могли бы вы взглянуть на этот вопрос о WindowManager? Спасибо stackoverflow.com/questions/27937250/ - person Hoa Vu; 15.01.2015
comment
@sandrstar Почему бы не анимировать mParentView напрямую? - person Run; 18.05.2021
comment
@Run это будет выглядеть иначе, чем анимация окна - person sandrstar; 19.05.2021
comment
@sandrstar какая разница? - person Run; 21.05.2021
comment
@Run, насколько я помню, это может быть связано с фоновым поведением - person sandrstar; 24.05.2021

Да, это действительно возможно. Пока представление, которое вы хотите анимировать, находится внутри контейнера, под контейнером я подразумеваю, например, LinearLayout или любой другой макет. Наконец, вид, который нужно анимировать, не должен быть корневым видом окна, поэтому вы должны иметь возможность анимировать вид :) Надеюсь, это поможет.

person xXJJJasonMokXx    schedule 19.02.2014