Android笔记----动画、属性动画

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013913314/article/details/51451994

好记性不如烂笔头。


帧动画

补间动画:Alpha、Scale、Translation、Rotate

属性动画:


属性动画常用的几个类:

ObjectAnimator:对象动画执行类

ValueAnimator:值动画执行类

PropertyValuesHolder:属性存值器

Keyframe:关键帧

AnimatorSet:动画执行集合类

AnimatorUpdateListener:动画更新监听

AnimatorListener:动画执行监听

AnimatorInflater 动画加载器

TypeEvaluator 类型估值



实现属性动画的方法:

1.调用ObjectAnimator的静态工厂方法创建动画(ofInt、ofFloat、ofObject);

2.调用setXxx()设置动画持续时间、插值方式、重复次数等;

3.设置监听事件;

4.调用Animator对象的start()方法启动动画。


//创建动画
ObjectAnimator yBouncer = ObjectAnimator.ofFloat(button, "ScaleX",0.0f, 1.0f);
//设置动画持续时间		
yBouncer.setDuration(2000);
// 设置插值器(用于调节动画执行过程的速度)
yBouncer.setInterpolator(new LinearInterpolator());
// 设置重复次数(缺省为0,表示不重复执行),设置为2表示总共执行3次
yBouncer.setRepeatCount(2);
// 设置重复模式(RESTART或REVERSE),重复次数大于0或INFINITE生效
yBouncer.setRepeatMode(ValueAnimator.RESTART);
// 设置动画开始的延时时间(200ms)
yBouncer.setStartDelay(200);
// 开始动画
yBouncer.start();

默认缩放点在button的中间位置,如果要设置在button的(0,0)坐标进行缩放,需要添加以下代码:

// 设置缩放的中心点
button.setPivotX(0);
button.setPivotY(0);
button.invalidate();

添加监听:

		ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 0.5f);
		anim.setDuration(1000);
		anim.addListener(new AnimatorListener() {
		    @Override
		    public void onAnimationStart(Animator animation) {
		        // 动画开始时调用
		    }

		    @Override
		    public void onAnimationRepeat(Animator animation) {
		        // 动画重复时调用
		    }
		    @Override
		    public void onAnimationEnd(Animator animation) {
		        // 动画结束时调用
		        ViewGroup parent = (ViewGroup) view.getParent();
		        if (parent != null)
		            parent.removeView(view);
		    }
		    @Override
		    public void onAnimationCancel(Animator animation) {
		        // 动画取消时调用
		    }
		});
		anim.start();

ValueAnimator:

ValueAnimator animator = ValueAnimator.ofFloat(0f, 200.0f);
// 设置作用对象
animator.setTarget(view);
// 设置执行时间
animator.setDuration(1000);
// 添加动画更新监听
animator.addUpdateListener(new AnimatorUpdateListener() {
 @Override
public void onAnimationUpdate(ValueAnimator animation) {
 // 获取当前值
 Float mValue = (Float) animation.getAnimatedValue();
// 设置横向偏移量
view.setTranslationX(mValue);
// 设置纵向偏移量
view.setTranslationY(mValue);	        
<span style="white-space:pre">	</span>}
});
animator.start();

PropertyValuesHolder:

		// 获取view左边位置
		int left = view.getLeft();
		// 获取view右边位置
		int right = view.getRight();
		// 将view左边增加10像素
		PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", left,
		        left + 10);
		// 将view右边减少10像素
		PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right",
		        right, right - 10);
		// 在X轴缩放从原始比例1f,缩小到最小0f,再放大到原始比例1f
		PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX",
		        1f, 0f, 1f);
		// 在Y轴缩放从原始比例1f,缩小到最小0f,再放大到原始比例1f
		PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY",
		        1f, 0f, 1f);
		// 将PropertyValuesHolder交付给ObjectAnimator进行构建
		ObjectAnimator customAnim = ObjectAnimator.ofPropertyValuesHolder(view,
		        pvhLeft, pvhRight, pvhScaleX, pvhScaleY);
		// 设置执行时间(1000ms)
		customAnim.setDuration(1000);
		// 开始动画
		customAnim.start();

Keyframe:
		// 设置在动画开始时,旋转角度为0度
		Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
		// 设置在动画执行50%时,旋转角度为360度
		Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
		// 设置在动画结束时,旋转角度为0度
		Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
		// 使用PropertyValuesHolder进行属性名称和值集合的封装
		PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
		// 通过ObjectAnimator进行执行
		ObjectAnimator.ofPropertyValuesHolder(view, pvhRotation)
		// 设置执行时间(1000ms)
		.setDuration(3000)
		// 开始动画
		.start();

ValueAnimator:

		// 类型估值 - 抛物线示例
		TypeEvaluator<PointF> typeEvaluator = new TypeEvaluator<PointF>() {
		    @Override
		    public PointF evaluate(float fraction, PointF startValue,
		            PointF endValue) {
		        float time = fraction * 3;
		        // x方向120px/s ,y方向0.5 * 200 * t * t
		        PointF point = new PointF();
		        point.x = 120 * time;
		        point.y = 0.5f * 200 * time * time;
		        return point;
		    }
		};
		ValueAnimator valueAnimator = ValueAnimator.ofObject(typeEvaluator,
		        new PointF(0, 0));
		valueAnimator.setInterpolator(new LinearInterpolator());
		valueAnimator.setDuration(3000);
		valueAnimator.start();
		
		valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
		    @Override
		    public void onAnimationUpdate(ValueAnimator animation) {
		        PointF point = (PointF) animation.getAnimatedValue();
		        view.setX(point.x);
		        view.setY(point.y);
		    }
		});







猜你喜欢

转载自blog.csdn.net/u013913314/article/details/51451994