Добавлен анимационный вид в WindowManager - PullRequest
11 голосов
/ 29 декабря 2011

У меня есть представление (customView), добавленное в WindowManager.

WindowManager mWm = (WindowManager)activity.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT, 0, PixelFormat.TRANSPARENT);
mWl.dimAmount = 0.0f;
mWm.addView(customView, mWl);

Внутри пользовательского представления я буду вызывать анимацию перевода при нажатии кнопки закрытия.

//// Это обработчик для анимации ////

final Handler translateHandler = new Handler();

final Runnable mtranslateUp = new Runnable() {
    public void run() {
        Log.v("TEST","mtranslateUp Runnable");
        startAnimation(translateUp);
    }
};

//// Это слушатель кнопки закрытия ////

View.OnClickListener closeButtonListener = new View.OnClickListener() {         

    public void onClick(View v) {
        translateHandler.post(mtranslateUp);
    }
};

//// Это анимация перевода ////

translateUp = new TranslateAnimation(0,0,0,-200);
translateUp.setFillAfter(true);
translateUp.setDuration(1000);
translateUp.setAnimationListener(new AnimationListener(){
        @Override
        public void onAnimationEnd(Animation animation) {
            Log.v("TEST","translateUp onAnimationEnd");
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationStart(Animation animation) {
            Log.v("TEST","translateUp onAnimationStart");
        }}
    );

Если в действие добавлен customView, этот код работает нормально!

Когда customView добавляется в WindowManager, журнал внутри onAnimationStart не отображается, но может отображаться журнал внутри Runnable.

Кто-нибудь может рассказать, как сделать анимацию для представления, которое добавлено в WindowManager?

Ответы [ 3 ]

10 голосов
/ 19 июня 2014

Вы должны анимировать представление LayoutParameters.Например, я использую метод для обновления макета представления:

    public void updateViewLayout(View view, Integer x, Integer y, Integer w, Integer h){
    if (view!=null) {
        WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view.getLayoutParams();

        if(x != null)lp.x=x;
        if(y != null)lp.y=y;
        if(w != null && w>0)lp.width=w;
        if(h != null && h>0)lp.height=h;

        mWindowService.updateViewLayout(view, lp);
    }
}

Очевидно, mWindowService является context.getSystemService (Context.WINDOW_SERVICE).Я запускаю этот метод в анимации:

    public static void overlayAnimation(final View view2animate, int viewX, int endX) {
    ValueAnimator translateLeft = ValueAnimator.ofInt(viewX, endX);
    translateLeft.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            int val = (Integer) valueAnimator.getAnimatedValue();
            updateViewLayout(view2animate, val, null, null, null);

        }
    });
    translateLeft.setDuration(ANIMATION_DURATION);
    translateLeft.start();
}
8 голосов
/ 29 марта 2012

Я столкнулся с аналогичной проблемой с View, прикрепленным к WindowManager. Попробуйте добавить ViewGroup в WindoManager, чем View напрямую.Это должно работать.

0 голосов
/ 29 августа 2012

windowManager нужна анимация по системе Android. поэтому пользовательская анимация не будет работать

...