对WindowManager中的View设置动画

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

传统动画包括帧动画和补间动画。帧动画主要是一帧一帧的播放。可以在xml中使用<animation-list>标签设置,也可以在代码中使用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;
<style name="default_style">
        <item name="@android:windowEnterAnimation">@anim/window_enter</item>
        <item name="@android:windowExitAnimation">@anim/window_exit</item>
</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设置任意的动画了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容