属性动画

今天主要说两个属性动画的执行类:
ObjectAnimator与 ValueAnimator;
一 :ObjectAnimctor:
ObjectAnimator属性动画的特点:
动画效果会改变控件的位置,且开启动画的是动画对象,而不是控件对象
注意:属性动画在android3.0以后出现的,所以需要把清单文件里的最低兼容版本修改为11以上;
现在手机基本都是4.0以上的;3.0以下的少之又少;
透明动画:
//得到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());
            }
        });
    }






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值