2011-12-29 2 views
11

WindowManager에 뷰 (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에 추가 된 뷰에서 애니메이션을 수행하는 방법을 알려줄 수 있습니까?

+0

어떤 해결책이 있습니까? 제발, 나도 똑같은 문제에 직면하고있다 – om252345

답변

7

WindowManager에 연결된 View에서 비슷한 문제가 발생했습니다. View보다 WindoManager에 ViewGroup을 직접 추가하십시오. 그것은 작동해야합니다.

+0

나는 이것을 시험해 보았다. ( – BVB

+0

팁 주셔서 감사합니다.) 저를 위해서 일하십시오. – alex

+0

이것은 또한 저를 위해 일했습니다! 위대한 팁 –

0

windowManager은 안드로이드 시스템으로 애니메이션이 필요합니다. 따라서 사용자 정의 애니메이션이 작동하지 않습니다.

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

+0

이것은 나를 위해 일한 유일한 해결책입니다, 감사합니다! TranslateAnimation을 사용했지만 주사위를 사용하지 않았습니다. –

관련 문제