2020-05-27-Android属性动画

2020-05-27  本文已影响0人  耿望

属性动画

属性动画支持在xml文件中定义,便于代码复用。
下面先给出一个最简单的ValueAnimator例子。
我们需要在res/animator目录下新建一份property.xml文件

<animator xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueType="intType"
    android:valueTo="30dp"
    android:valueFrom="300dp"
    android:duration="1000"
    android:startOffset="100"
    android:repeatCount="3"
    android:repeatMode="reverse"/>

然后在java中通过AnimatorInflater.loadAnimator方法load这份文件。


    private ImageView imageView;
    private ValueAnimator valueAnimator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movie);
        imageView = findViewById(R.id.animatorImg);
        valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.property);
        imageView.setOnClickListener(new clickUpdate());
    }

然后定义一个回调,可以在动画过程中改变view的属性值。

    private class valueUpdate implements ValueAnimator.AnimatorUpdateListener {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int current = (int) animation.getAnimatedValue();
            imageView.getLayoutParams().height = current;
            imageView.getLayoutParams().width = current;
            imageView.requestLayout();
        }
    }

最后为该view定义一个点击效果,每次点击会执行一个缩放动画。

    private class clickUpdate implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            scaleImg();
        }
    }
    private void scaleImg() {
        valueAnimator.addUpdateListener(new valueUpdate());
        valueAnimator.start();
    }

还有一种ObjectAnimator继承了ValueAnimator。
我们可以在XML中指定需要修改的属性,而不需要在代码中使用回调,更加简单。
下面给出一个例子,设置图片的透明度从0.1到1.0渐变。

<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="alpha"
    android:valueTo="0.1f"
    android:valueFrom="1.0f"
    android:valueType="floatType"
    android:duration="1000"
    android:repeatCount="3"
    android:repeatMode="reverse"
    android:startOffset="100"/>
private ObjectAnimator objectAnimator;
objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.property_animator);
        objectAnimator.setTarget(imageView);
objectAnimator.start();

参考

属性动画概览
动画资源
Android属性动画解析和实例

上一篇 下一篇

猜你喜欢

热点阅读