2011-12-29 116 views
11

我有一個視圖(customView)添加到WindowManager中。添加在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中的Log沒有顯示,但可以顯示Runnable內的Log。

任何人都可以告訴如何對添加到WindowManager的視圖執行動畫嗎?

+0

你有這方面的解決方案嗎?請分享,我也面臨同樣的問題 – om252345 2012-05-09 19:55:47

回答

7

我正面臨與WindowManager相關的視圖的類似問題。嘗試將ViewGroup直接添加到WindoManager而不是View。它應該工作。

+0

我試過了,它沒有工作:( – BVB 2014-01-03 00:48:41

+0

感謝提示。適合我:) – alex 2014-04-08 15:23:46

+0

這也適用於我!偉大的提示 – 2014-09-04 09:21:48

0

windowManager需要android系統的動畫。所以自定義動畫將不起作用

10

您應該爲視圖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(); 
} 
+1

很酷,這是正確的方式沒有將視圖包裝到ViewGroup中 – qbasso 2014-09-12 07:17:38

+0

這是唯一對我有用的解決方案,謝謝!我嘗試使用TranslateAnimation,但沒有骰子。 – 2016-04-28 23:21:22