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设置任意的动画了
网友评论