属性动画

来源:互联网 发布:c语言计算最大公约数 编辑:程序博客网 时间:2024/05/19 03:27
今天主要说两个属性动画的执行类:
ObjectAnimator与 ValueAnimator;
一 :ObjectAnimctor:
ObjectAnimator属性动画的特点:
动画效果会改变控件的位置,且开启动画的是动画对象,而不是控件对象
注意:属性动画在android3.0以后出现的,所以需要把清单文件里的最低兼容版本修改为11以上;
现在手机基本都是4.0以上的;3.0以下的少之又少;
参考鸿洋博客:
http://blog.csdn.net/lmj623565791/article/details/38067475/

透明动画:
//得到ObjectAnimator的对象,参数一:View控件,代表你要修改的那个控件的属性//参数二:字符串,什么类型的动画;参数三:控件修改的参数,float数组ObjectAnimator alpha = ObjectAnimator.ofFloat(imageView, "alpha", new float[]{0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1.0f});//设置动画的执行时长alpha.setDuration(3000);//设置动画执行的模式alpha.setRepeatMode(ObjectAnimator.RESTART);//设置动画执行次数alpha.setRepeatCount(0);//0的话执行一次,1的话执行两次,以此类推;//开启动画alpha.start();
旋转动画:
ObjectAnimator rotationY = ObjectAnimator.ofFloat(imageView, "rotationY", new float[]{90f, 180f, 270f, 360f});//设置动画的执行时长rotationY.setDuration(3000);//设置动画执行的模式rotationY.setRepeatMode(ObjectAnimator.RESTART);//设置动画执行次数rotationY.setRepeatCount(0);//0的话执行一次,1的话执行两次,以此类推;//开启动画rotationY.start();
平移动画:
ObjectAnimator translationY = ObjectAnimator.ofFloat(imageView, "translationY", new float[]{10f, 20f, 30f, 40f, 50f, 60f, 50f, 40f, 30f, 20f, 10f}).setDuration(3000);translationY.setRepeatMode(ObjectAnimator.RESTART);translationY.start();
缩放:
ObjectAnimator scaleX = ObjectAnimator.ofFloat(imageView, "scaleX", new float[]{1f, 2f, 3f, 4f, 5f, 6f, 5f, 4f, 3f, 2f, 1f}).setDuration(3000);scaleX.setRepeatMode(ObjectAnimator.RESTART);scaleX.start();
动画集合:
//创建动画集合对象AnimatorSet set=new AnimatorSet();//把需要放到结合动画的对象创建出来,最后全部添加到设置集合动画的方法里去ObjectAnimator translationY2 = ObjectAnimator.ofFloat(imageView, "translationY", new float[]{10f, 20f, 30f, 40f, 50f, 60f, 50f, 40f, 30f, 20f, 10f}).setDuration(3000);ObjectAnimator scaleX2 = ObjectAnimator.ofFloat(imageView, "scaleX", new float[]{1f, 2f, 3f, 4f, 5f, 6f, 5f, 4f, 3f, 2f, 1f}).setDuration(3000);ObjectAnimator rotationY2 = ObjectAnimator.ofFloat(imageView, "rotationY", new float[]{90f, 180f, 270f, 360f}).setDuration(3000);ObjectAnimator alpha2 = ObjectAnimator.ofFloat(imageView, "alpha", new float[]{0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1.0f}).setDuration(3000);//注意:可以设置AnimatorSet里的动画有两个方法playTogether,playSequentially;//set.playTogether(translationY2,scaleX2,rotationY2,alpha2);//同时执行set.playSequentially(translationY2,scaleX2,rotationY2,alpha2);//先执行完一个动画效果,再执行下一个set.start();
在XML中定义属性动画:





来一个示例:
//旋转动画
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="rotationX"
android:duration="3000"
android:repeatCount="1"
android:repeatMode="restart"
android:startOffset="0"
android:valueFrom="360.0"
>
</objectAnimator>
在XML定义动画类属性,浮点型小树,直接写小数即可,不用带f;
提示:控件唯一的参数在XML文件里有所不同,不过更简单,不用再特意去定义参照物的属性,
直接根据值,区分两种方式:
第一种:一整个屏幕为参照物,在XML文件属性定义值是int%p;
第二种:以控件自身大小为参照物,在XML文件属性定义值是int
最后在Activity中引用:
//调用动画XML文件
//此处用XML的形式,先进行引用
Animator Xmlanimator = AnimatorInflater.loadAnimator(this,R.animator.objectanimator);
//使动画对象和要做动画的控件相关联
Xmlanimator.setTarget(imageView);
//开启动画
Xmlanimator.start();
下面是ValueAnimation属性动画:(参考鸿洋博客)
无需设置操作的属性;这就是和ObjectAnimator的区别
好处:不需要操作对象的属性,一定要有getter,setter方法,你可以根据当前动画的计算值,来操作任何属性;
首先需要获得屏幕的高:
//获取屏幕的高度
DisplayMetrics outMetrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(outMetrics);mScreenHeight = outMetrics.heightPixels;
下面设置一个抛物线的动画:
//抛物线public void paowuxian(View view){    Toast.makeText(MainActivity.this,"paowuxian",Toast.LENGTH_SHORT).show();    //获取动画执行类    ValueAnimator valueAnimator=new ValueAnimator();    //设置执行时间    valueAnimator.setDuration(3000);    //设置起始坐标    valueAnimator.setObjectValues(new PointF(0,0));    //设置类型估值    valueAnimator.setEvaluator(new TypeEvaluator<PointF>(){        @Override        public PointF evaluate(float fraction, PointF startValue, PointF endValue) {            Log.e("PY", fraction * 3 + "");            // x方向200px/s ,则y方向0.5 * 10 * t            PointF point = new PointF();            point.x = 200 * fraction * 3;            point.y = 0.5f * 200 * (fraction * 3) * (fraction * 3);            return point;        }    });    valueAnimator.start();    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {        @Override        public void onAnimationUpdate(ValueAnimator valueAnimator) {            PointF point = (PointF) valueAnimator.getAnimatedValue();            mBlueBall.setX(point.x);            mBlueBall.setY(point.y);        }    });}
再设置一个垂直的动画:
  //垂直  自由落体    public void verticalRun(View view){        Toast.makeText(MainActivity.this,"verticalRun",Toast.LENGTH_SHORT).show();        //参数一:X轴起始位置;参数二:Y轴的位置(屏幕的高度减去控件的高度开始计算)        ValueAnimator animator = ValueAnimator.ofFloat(0, mScreenHeight - mBlueBall.getHeight());        animator.setTarget(mBlueBall);        //设置动画时间及开启动画        animator.setDuration(5000).start();    //  animator.setInterpolator(value)        //添加动画更新的监听        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()        {            @Override            public void onAnimationUpdate(ValueAnimator animation)            {                mBlueBall.setTranslationY((Float) animation.getAnimatedValue());            }        });    }






原创粉丝点击