Android 动画用法+原理(Property Animation) 酷炫 UI动画

 

1.Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent

https://blog.csdn.net/WHB20081815/article/details/62888575

2.Android 滑动冲突的完美解决方案 listview和scroView

https://blog.csdn.net/WHB20081815/article/details/88617041

3.Android 深入理解 View 的绘制流程和机制

https://blog.csdn.net/WHB20081815/article/details/62236641

4.Android 5.0 6.0 以及7.0新特性 MD风格 敏感权限 文件访问

https://blog.csdn.net/WHB20081815/article/details/70244065

5.Android 万能适配方案和UI屏幕适配 不同分辨率 最全面 最易懂的

https://blog.csdn.net/WHB20081815/article/details/76937801

6.Android 2分钟刷Android 8.0系统 和 8.0适配 完美方案

https://blog.csdn.net/WHB20081815/article/details/75669925

7.Android快速理解Activity、View及Window&WindowManager之间关系

https://blog.csdn.net/WHB20081815/article/details/62419059

 

3.0以前2种动画方式:

 

两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation)。

1.逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后通过顺序的播放排列好的图片来实现,类似电影

2.补间动画则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。

 

Android开发团队决定在3.0版本当中引入属性动画这个功能,它的灵活性更好

1.可以不仅仅操作view,还可以操作里面的对象

2.对View的背景色进行动态地改变

3.补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性

 

ValueAnimator是整个属性动画机制当中最核心的一个类,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。

 

TypeEvaluator(估值器) :替代ValueAnimator.ofFloat()方法就是实现了初始值与结束值之间的平滑过度

插值器(Interpolator):anim.setInterpolator(new DecelerateAccelerateInterpolator()); 

 

public final class ObjectAnimator extends ValueAnimator
public class ValueAnimator extends Animator

 

ValueAnimator用法:操作一个对象

Point point1 = new Point(0, 0);

Point point2 = new Point(300, 300);

ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2);

好处:不需要操作的对象的属性一定要有getter和setter方法,你可以自己根据当前动画的计算值,来操作任何属性

   mBlueBall

   public void verticalRun(View view)  

    {  

        ValueAnimator animator = ValueAnimator.ofFloat(0, mScreenHeight  

                - mBlueBall.getHeight());  

        animator.setTarget(mBlueBall);  

        animator.setDuration(1000).start();  

    }

 

ObjectAnimator 用法:可以操作属性

当过渡的效果不满足,自定定义估值器:public class PointEvaluator implements TypeEvaluator {

ObjectAnimator moveIn = ObjectAnimator.ofFloat(this, "translationX", -500f, 0f);

ObjectAnimator anim2 = ObjectAnimator.ofObject(this, "color", new ColorEvaluator(),

        "#0000FF", "#FF0000");

 

AnimatorSet

/**用于把不同的动画进行组合*/

AnimatorSet animSet = new AnimatorSet();

animSet.play(anim).with(anim2).before(moveIn);//属性动画的组合

 

实现一个动画更改多个效果:使用propertyValuesHolder:

可以用animSet.play(anim).with(anim2)替代

 

 

public void propertyValuesHolder(View view)
{
    PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
            0f, 1f);
    PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,
            0, 1f);
    PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,
            0, 1f);
    ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY,pvhZ).setDuration(1000).start();
}

          

      //用法2

       

PropertyValuesHolder pv1 = PropertyValuesHolder.ofFloat("scaleX", 1, 0);
PropertyValuesHolder pv2 = PropertyValuesHolder.ofFloat("scaleY", 1, 0);
PropertyValuesHolder alph = PropertyValuesHolder.ofFloat("alpha", 0, 1);
ObjectAnimator ob1 = ObjectAnimator.ofPropertyValuesHolder(rl, pv1);
ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(rl, alph);
ObjectAnimator oa1 = ObjectAnimator.ofPropertyValuesHolder(rl, pv2);
AnimatorSet animSet = new AnimatorSet();
animSet.play(ob1).after(oa);
animSet.play(ob1).with(oa1);
animSet.setDuration(4000);
animSet.start();

 

 

/***
 * PropertyValuesHolder的用法
 * @param animType
 */
private void startParentScaleAnim(final int animType) {
    PropertyValuesHolder pv1 = PropertyValuesHolder.ofFloat("scaleX", 1, 0);
    PropertyValuesHolder pv2 = PropertyValuesHolder.ofFloat("scaleY", 1, 0);

    //方式One
    ObjectAnimator.ofPropertyValuesHolder(mBlueBall, pv2,pv1).setDuration(5000).start();

    //two
    ObjectAnimator ob1 = ObjectAnimator.ofPropertyValuesHolder(mBlueBall, pv1);
    ObjectAnimator oa1 = ObjectAnimator.ofPropertyValuesHolder(mBlueBall, pv2);
    AnimatorSet animSet = new AnimatorSet();
    animSet.play(ob1).with(oa1);
    animSet.setDuration(5000);
    animSet.start();
}

 

动画的监听

/**添加监听事件
 * new AnimatorListenerAdapter 好处,可以只监听某个动画的事件
 * new Animator.AnimatorListener 所有动画的监听
 * */
moveIn.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationCancel(Animator animation) {
        super.onAnimationCancel(animation);
    }

 

moveIn.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {

    }

 

ViewPropertyAnimator

 

大家注意到,在使用ViewPropertyAnimator时,我们自始至终没有调用过start()方法,这是因为新的接口中使用了隐式启动动画的功能,只要我们将动画定义完成之后,动画就会自动启动。并且这个机制对于组合动画也同样有效,只要我们不断地连缀新的方法,那么动画就不会立刻执行,等到所有在ViewPropertyAnimator上设置的方法都执行完毕后,动画就会自动启动。当然如果不想使用这一默认机制的话,我们也可以显式地调用start()方法来启动动画。

ViewPropertyAnimator的所有接口都是使用连缀的语法来设计的,每个方法的返回值都是它自身的实例,因此调用完一个方法之后可以直接连缀调用它的另一个方法,这样把所有的功能都串接起来,我们甚至可以仅通过一行代码就完成任意复杂度的动画功能。

 

 

AS源代码地址:不知道为什么传不上

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值