Android 属性动画框架 ObjectAnimator、ValueAnimator ,这一篇就够了 (2)

可以看到我们传入三个参数,这里我做的是缩放动画,所以给的分别是控件,控件当前大小和控件目标大小。然后根据监听器返回的值进行设置即可。
调用方面
我这里实现的是上拉隐藏和下拉显示,所以我们需要判断下 Y轴 滑动方向:

@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_UP: startY = event.getY(); if ((startY - endY) < 0){ // 缩小 animationDown(fab, buttonSize); animationDown(imageView, imageSize); }else if ((startY - endY) > 0){ // 放大 animationUp(fab, buttonSize); animationUp(imageView, imageSize); } break; case MotionEvent.ACTION_DOWN: endY = event.getY(); break; } return super.onTouchEvent(event); } private void animationDown(final View view, int originalSize){ ValueAnimator animator = createValueAnimate(view, originalSize, 0); animator.addListener(new AnimatorListenerAdapter(){ @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); view.setVisibility(View.GONE); } }); animator.setInterpolator(new BounceInterpolator()); animator.setDuration(500).start(); } private void animationUp(final View view, int originalSize){ view.setVisibility(View.VISIBLE); ValueAnimator animator = createValueAnimate(view, 0, originalSize); animator.setInterpolator(new BounceInterpolator()); animator.setDuration(500).start(); }

这里我们会发现,由于是属性动画,所以改变的直接就是控件的大小,这就导致了一个问题,如果是实时的获取控件大小。那么我们在执行完多小动画,也就是 animationDown 后,就无法在获得控件原始大小了。
所以这里我们在 onResume 方法中获取控件大小:

@Override protected void onResume() { super.onResume(); fab.post(new Runnable() { @Override public void run() { buttonSize = fab.getHeight(); } }); imageView.post(new Runnable() { @Override public void run() { imageSize = imageView.getHeight(); } }); } 实战演练

属性动画可以作为 ViewGroup 增加活减少控件是的动画,是的界面的变换不是那么的突兀,其实细心的同学可能有发现,android 是自带切换效果的,但是形式比较单一,所以这里我通过自定义 ObjectAnimator 的方法。

最后效果

在这里插入图片描述


实现过程其实非常简单:

首先 实例化出来一个 LayoutTransition 对象

接着 通过 ObjectAnimator.ofPropertyValuesHolder() 实例化出来一个用于载入动画的

ObjectAnimator 对象

然后 在 ObjectAnimator.ofPropertyValuesHolder() 中设置一系列的动画效果

用 setAnimation 方法将该 ObjectAnimator 对象设置为 transition 的动画

为 ObjectAnimator 对象设置 Duration 执行时间

设置动画延时 setStartDelay

用同样的方法设置 remove 动画

LayoutTransition transition = new LayoutTransition(); ObjectAnimator appendAnimator = ObjectAnimator.ofPropertyValuesHolder( (ImageView) null, PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f), PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f), PropertyValuesHolder.ofFloat("alpha" , 0.0f, 1.0f) ); appendAnimator.setInterpolator(new BounceInterpolator()); transition.setAnimator(LayoutTransition.APPEARING, appendAnimator); transition.setDuration(LayoutTransition.APPEARING, transition.getDuration(LayoutTransition.APPEARING)); transition.setStartDelay(LayoutTransition.APPEARING, transition.getStartDelay(LayoutTransition.APPEARING)); ObjectAnimator removeAnimator = ObjectAnimator.ofPropertyValuesHolder( (ImageView) null, PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f), PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f), PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f) ); removeAnimator.setInterpolator(new BounceInterpolator()); transition.setAnimator(LayoutTransition.DISAPPEARING, removeAnimator); transition.setDuration(LayoutTransition.DISAPPEARING, transition.getDuration(LayoutTransition.DISAPPEARING)); transition.setStartDelay(LayoutTransition.DISAPPEARING, transition.getStartDelay(LayoutTransition.DISAPPEARING));

最后通过 setLayoutTransition 将这个 LayoutTransition 对象付给你的 ViewGroup 即可

layout = findViewById(R.id.layout); layout.setLayoutTransition(transition); 测试环节

测试是分为添加控件和移除控件,功能在活动中动态的执行:
添加方法

首先创建好一个控件,这里我拿的是 (ImageView 举例)

将其 大小、内容等属性设置完成

调用 LinearLayout 的 addView 方法添加控件到布局的指定位置

移除方法

首先判断该线下布局中是否有控件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzds.html