对WindowManager中的View设置动画

1.直接对View设置传统动画

传统动画包括帧动画和补间动画。帧动画主要是一帧一帧的播放。可以在xml中使用标签设置,也可以在代码中使用AnimationDrawable设置;补间动画主要包括alpha, translate, scale, rotate。

ScaleAnimation animation = new ScaleAnimation(0.0f, 1f, 0.0f, 1f, Animation.ABSOLUTE, 100, Animation.ABSOLUTE, 100);
animation.setDuration(100);
view.setAnimation(animation);
animation.start();
mWindowManager.addView(defaultSplashLayout, lp);

进行这样的设置,view的动画无法生效。原因是动画执行的条件是不能直接添加到最顶层的Window,而是需要一个容器。
如果添加一个容器,则只能对容器内的view进行动画设置,还是无法对容器进行动画设置。

2.对WindowManager.LayoutParams的windowAnimations设置动画

 WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
 lp.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
 lp.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
 lp.format = PixelFormat.RGB_888;
 lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
 lp.windowAnimations = R.style.default_style;

这样设置以后,这个view都会执行动画,但是动画都是写死在xml文件中的,无法进行动态设置

3.对View设置属性动画

属性动画对最顶层的view是可以执行的。

view.setPivotX(100);
view.setPivotY(100);
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
valueAnimator.setDuration(200).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
       @Override
       public void onAnimationUpdate(ValueAnimator animation) {
              Float value = (Float) animation.getAnimatedValue();
              view.setScaleX(value);
              view.setScaleY(value);
       }
});
mWindowManager.addView(defaultSplashLayout, lp)

至此,就可以对WindowManager的View设置任意的动画了

你可能感兴趣的:(对WindowManager中的View设置动画)