android动画 -- Property Animator

来源:互联网 发布:滨海战斗舰数据 编辑:程序博客网 时间:2024/05/07 04:44

属性动画原理

根据时间的推移,Property Animation改变组件view的实际动作属性,从而完成动画效果;在组件开始动画之前必须满足一个条件,就是必须要提供组件的setX和getX方法,因为属性动画会根据你传入的propertyName,如下“width”,它会去你的mButton里面去找setWidth方法,如果你的propertyName不对,它会包找不到setPropertName这个方法,无法完成动画;
但是如果你使用Button来做动画效果时,如下代码:

ObjectAnimator.ofInt(mButton, "width", 500).setDuration(5000).start(); 

发现它根本就没有动画效果,这是因为Button是继承TextView的,虽然提供了setWidth和getWidth方法,但是TextView的setWidth根本不是改变组件的宽度值,其源码如下:

@android.view.RemotableViewMethod    public void setWidth(int pixels) {        mMaxWidth = mMinWidth = pixels;        mMaxWidthMode = mMinWidthMode = PIXELS;        requestLayout();        invalidate();    }

所以,在我们使用一些组件的时候,如果动画效果不发生改变的话,建议对组件进行封装一下,执行提供set和get方法,如下方案:

private static class ViewWrapper{        View mTarget;        public ViewWrapper(View target){            mTarget = target;        }        public int getWidth(){            return mTarget.getLayoutParams().width;        }        public void setWidth(int width){            mTarget.getLayoutParams().width = width;            mTarget.requestLayout();        }    }        Button btn = (Button)findViewById(R.id.btn);        final ViewWrapper wrapper = new ViewWrapper(btn);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                ObjectAnimator.ofInt(wrapper , "width", 500).setDuration(5000).start();            }        });

这样就能正确完成动画效果了;从上面也可以看出,属性动画就是在动画过程中改变组件的状态值,从而完成动画效果,下面讲讲动画的使用;

ObjectAnimator 动画的执行类

ObjectAnimator 可以直接作用在组件上,根据设置的动画的各个状态值完成动画,使用方法超级简单,看范例即可:

TextView tv = (TextView)findViewById(R.id.text);ObjectAnimator.ofInt(tv, "width", 0, 500).setDuration(5000).start();ObjectAnimator.ofInt(tv, "width", 0, 500).setDuration(5000).start();

注意第二个参数width,动画过程中它会去找setWidth,所以你必须填写对

ValueAnimator

ValueAnimator 不能直接作用在view组件上,它用于状态的模拟,也就是组件从一个状态变化到另一个状态,模拟出中间的每个状态值,组件再把这个状态值设置到自身上去,从而实现动画效果,看使用范例:

public void animatorTest(final View view){        ValueAnimator animator = ValueAnimator.ofInt(view.getLayoutParams().width,view.getLayoutParams().width + 100);        animator.addUpdateListener(new AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator arg0) {                // TODO Auto-generated method stub                Integer i = (Integer)arg0.getAnimatedValue();                Log.i("jackzhous", "i = " + i);                view.getLayoutParams().width = i;                 view.requestLayout();            }        });        animator.setDuration(1000).start();    }

设置监听,更新状态即可;

组合动画

组合动画也就是将上面几个动画加在一起一块执行;方法有三种

使用AnimatorSet

//设置多组ObjectAnimator对象动画效果;设置他们的动画先后关系*/        ObjectAnimator anim1 =  ObjectAnimator.ofFloat(v, "scal", 1f, 0.0f).setDuration(1000);         ObjectAnimator anim2 =  ObjectAnimator.ofFloat(v, "scaleY", 1f, 0.0f).setDuration(1000);         ObjectAnimator anim3 =  ObjectAnimator.ofFloat(v, "alpha", 1f, 0.0f).setDuration(1000);        AnimatorSet aS = new AnimatorSet();        aS.play(anim1).with(anim2);        aS.play(anim2).with(anim3);        aS.start();  

使用ObjectAnimator 时,同时增加更新监听

每一帧图像刷新的时候就调用下面的监控函数,在里面我们去设置那个值就可以了        ObjectAnimator anim =  ObjectAnimator.ofFloat(v, "scal", 1f, 0.0f).setDuration(1000);        anim.addUpdateListener(new AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator arg0) {                // TODO Auto-generated method stub                float value = (Float) arg0.getAnimatedValue();                v.setAlpha(value);                v.setScaleX(value);                v.setScaleY(value);                Log.i(TAG, "onAnimationUpdate");            }        });        anim.start();

通过PropertyValuesHolder设置动画属性,将属性添加到ObjectAnimator里面去即可

        PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f);        PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f);        PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f);        ObjectAnimator.ofPropertyValuesHolder(v, holder1, holder2, holder3).setDuration(5000).start();    }

动画监听

有时候我们需要监听动画过程的每个状态,从而执行相应的动作,属性动画为我们提供了监听,

animator.addListener(new AnimatorListener() {            @Override            public void onAnimationStart(Animator arg0) {                // TODO Auto-generated method stub            }            @Override            public void onAnimationRepeat(Animator arg0) {                // TODO Auto-generated method stub            }            @Override            public void onAnimationEnd(Animator arg0) {                // TODO Auto-generated method stub            }            @Override            public void onAnimationCancel(Animator arg0) {                // TODO Auto-generated method stub            }        });

XML方式使用动画:

在res/anim下创建xml文件 
<?xml version="1.0" encoding="utf-8"?>  <set xmlns:android="http://schemas.android.com/apk/res/android"      android:ordering="together" >      <objectAnimator          android:duration="1000"          android:propertyName="scaleX"          android:valueFrom="1"          android:valueTo="0.5" >      </objectAnimator>      <objectAnimator          android:duration="1000"          android:propertyName="scaleY"          android:valueFrom="1"          android:valueTo="0.5" >      </objectAnimator>  </set>      Java代码中读取:      Animator anim = AnimatorInflater.loadAnimator(this, R.animator.scale);    //利用AnimatorInflater读取xml文件        mMv.setPivotX(0);          mMv.setPivotY(0);          //显示的调用invalidate          mMv.invalidate();          anim.setTarget(mMv);        //设置对象        anim.start();
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 黑布鞋不黑了怎么办 黑布鞋退白了怎么办 老北京布鞋款式太少怎么办 老人输液抽搐后昏迷怎么办 头七家里有狗怎么办 股票退市股民的钱怎么办 美国股票退市股民怎么办 百度云字幕和视频不同步怎么办 百度云加载字幕有延迟怎么办 很难适应新环境怎么办 蜘蛛丝碰到嘴唇上起包有毒怎么办? 电瓶车在路上爆胎了怎么办 嘴被虫子咬肿了怎么办 高铁管家购票失败怎么办 高铁车厢空调冷怎么办 高铁票过了时间怎么办 网购火车票丢了怎么办 改签没有票了怎么办 火车票取了没赶上车怎么办 上车后车票丢了怎么办 晒了吗任务过期怎么办 坐火车买了站票怎么办 坐火车忘记带票怎么办 距离二本线差几分怎么办 行李包落火车候车厅怎么办 高铁票买错地点怎么办 高铁票买错日期怎么办 票买错时间了怎么办 上高铁了票丢了怎么办 上车前高铁票丢了怎么办 高铁安检没收的东西怎么办 高铁安检员老了怎么办 高铁安检喷雾拍照了怎么办 十个小时的高铁怎么办 华为开机需要激活码怎么办 高铁提前上车了出站怎么办 买火车票忘记带身份证怎么办 买高铁票没赶上怎么办 电脑放视频没有声音怎么办 内业计算中角度超限怎么办 遇到飞机出故障乘客怎么办