属性动画Animator

来源:互联网 发布:如何测试80端口 编辑:程序博客网 时间:2024/05/17 23:23

属性动画Animator的使用方法

public class MainActivity extends AppCompatActivity {    private ImageView showIv;    private RelativeLayout relativeLayout;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        showIv = (ImageView) findViewById(R.id.showIv);        relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);        showIv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //调用使用ValueAnimator的方法完成动画//                useValueAnimator();                //调用使用ObjectAnimator的方法完成动画//                 useObjectAnimator();                //调用使用ViewPropertyAnimator的方法完成动画//                    useViewPropertyAnimator();                //调用使用AnimatorSet的方法完成组合动画//                useAnimatorSet();                //调用使用ObjectAnimator完成组合动画//                useObjectAnimatorSet();                //调用使用ValueAnimator完成组合动画//                useValueAnimatorSet();                //调用通过引用ValueAnimation的xml文件完成动画//                useValueAnimatorXml();                //调用通过引用ObjectAnimator的xml文件完成动画//                useObjectAnimatorXml();                //调用通过引用AnimatorSet的xml文件完成动画//                useAnimatorSetXml();                //调用通过值动画来改变背景颜色//                ValueAnimatorSetBackgrundColor();            }        });        //通过ValueAnimator完成对自定义View对象的动画效果        ValueAnimatorOfObject();    }    //使用ValueAnimator的方法完成动画    private void useValueAnimator() {//        属性动画  ValueAnimator 的用法  ,属性动画本质是值动画        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);        valueAnimator.setDuration(3000);        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                float animatedValue = (float) animation.getAnimatedValue();                //设置透明//                        showIv.setAlpha(animatedValue);                ViewGroup.LayoutParams layoutParams = showIv.getLayoutParams();                layoutParams.width = (int) (animatedValue * 500);                layoutParams.height = (int) (animatedValue * 500);                showIv.setLayoutParams(layoutParams);            }        });        valueAnimator.start();    }    //使用ObjectAnimator的方法完成动画    private void useObjectAnimator() {        //透明度变化//        ObjectAnimator alphaObjectAnimator = ObjectAnimator.ofFloat(showIv,"alpha",0,1);//        alphaObjectAnimator.setDuration(3000).start();        //平移动画//        ObjectAnimator translationXObjectAnimator = ObjectAnimator.ofFloat(showIv, "translationX", 0, 1000);//        translationXObjectAnimator.setDuration(3000).start();        //旋转动画//        ObjectAnimator rotateObjectAnimator = ObjectAnimator.ofFloat(showIv, "rotation", 0, 360);//        rotateObjectAnimator.setDuration(3000).start();        //缩放动画        ObjectAnimator scaleObjectAnimator = ObjectAnimator.ofFloat(showIv, "scaleX", 0f, 2f);        scaleObjectAnimator.setDuration(3000);        //重复3次        scaleObjectAnimator.setRepeatCount(3);        scaleObjectAnimator.setRepeatMode(ValueAnimator.REVERSE);        scaleObjectAnimator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {            }            @Override            public void onAnimationEnd(Animator animation) {            }            @Override            public void onAnimationCancel(Animator animation) {            }            @Override            public void onAnimationRepeat(Animator animation) {            }        });        scaleObjectAnimator.start();    }    //使用ViewPropertyAnimator的方法完成动画    private void useViewPropertyAnimator() {        showIv.animate().alpha(0.5f)                .translationX(300)                .scaleX(2)                .scaleY(2)                .rotation(360f)                .setDuration(3000)                //延迟两秒执行                .setStartDelay(2000)                .start();    }    //使用AnimatorSet的方法完成组合动画    private void useAnimatorSet() {        AnimatorSet animatorSet = new AnimatorSet();        ObjectAnimator alpha = ObjectAnimator.ofFloat(showIv, "alpha", 0f, 1f);        ObjectAnimator translationX = ObjectAnimator.ofFloat(showIv, "translationX", 0f, 200f);        animatorSet.playTogether(alpha, translationX);        animatorSet.setDuration(3000);        animatorSet.start();    }    //使用ObjectAnimator完成组合动画    private void useObjectAnimatorSet() {        PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0f, 1f);        PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", 0f, 200f);        ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(showIv, alpha, translationX);        objectAnimator.setDuration(3000);        objectAnimator.start();    }    //使用ValueAnimator完成组合动画    private void useValueAnimatorSet() {        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                float animatedValue = (float) animation.getAnimatedValue();                ViewGroup.LayoutParams layoutParams = showIv.getLayoutParams();                layoutParams.width = (int) (animatedValue * 300);                layoutParams.height = (int) (animatedValue * 300);                showIv.setLayoutParams(layoutParams);                showIv.setAlpha(animatedValue);            }        });        valueAnimator.setDuration(3000);        valueAnimator.start();    }    //通过引用ValueAnimation的xml文件完成动画    private void useValueAnimatorXml() {        ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.value_animator);        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                float animatedValue = (float) animation.getAnimatedValue();                showIv.setAlpha(animatedValue);            }        });        animator.setDuration(3000);        animator.start();    }    //value_animator的XML类
   <animator xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="3000"    android:valueFrom="0f"    android:valueTo="0.5f"    android:valueType="floatType">   </animator>


 //通过引用ObjectAnimator的xml文件完成动画 private void useObjectAnimatorXml() { ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.object_animator); animator.setTarget(showIv); animator.start(); }
 //object_animator的XML类
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="3000"    android:valueFrom="0f"    android:valueTo="0.5f"    android:valueType="floatType"    android:propertyName="alpha">   </objectAnimator>

 //通过引用AnimatorSet的xml文件完成动画 private void useAnimatorSetXml() { AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.set_animator); animator.setTarget(showIv); animator.start(); }
//set_animator的XML的类
   <set xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="3000"    android:ordering="sequentially">    <objectAnimator        android:duration="3000"        android:valueFrom="0f"        android:valueTo="0.5f"        android:valueType="floatType"        android:propertyName="alpha">    </objectAnimator>    <objectAnimator        android:duration="3000"        android:valueFrom="0f"        android:valueTo="200f"        android:valueType="floatType"        android:propertyName="translationX">    </objectAnimator>  </set>

 
  //通过值动画来改变背景颜色    private void ValueAnimatorSetBackgrundColor() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            ValueAnimator valueAnimator = ValueAnimator.ofArgb(0xffff0000, 0xff0000ff, 0xff00ff00);            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {                @Override                public void onAnimationUpdate(ValueAnimator animation) {                    int animatedValue = (int) animation.getAnimatedValue();                    relativeLayout.setBackgroundColor(animatedValue);                }            });            valueAnimator.setDuration(2000);            valueAnimator.start();        }    }    //通过ValueAnimator完成对自定义View对象的动画效果    private void ValueAnimatorOfObject() {        Point startPoint = new Point(0, 0);        Point endPoint = new Point(1000, 1000);        //fraction是一个从0到1变化的值        ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator<Point>() {            @Override            public Point evaluate(float fraction, Point startValue, Point endValue) {                float startX = startValue.getX();                float endX = endValue.getX();                float currentX = startX + fraction * (endX - startX);                float startY = startValue.getY();                float endY = endValue.getY();                float currentY = startY + fraction * (endY - startY);                return new Point(currentX, currentY);            }        }, startPoint, endPoint);        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                Point point = (Point) animation.getAnimatedValue();            }        });    }}

自定义ViewMyCircleView类

public class MyCircleView extends View {    Paint paint;    float radius = 100;    Point currentPoint;    public MyCircleView(Context context) {        super(context);        init();    }    public MyCircleView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        init();    }    private void init() {        paint = new Paint();        paint.setAntiAlias(true);        paint.setColor(Color.BLUE);    }    //根据currentPoint的x和y确定圆心的位置,去画圆    private void drawCirle(Canvas canvas) {        //只执行一次动画        if (currentPoint == null) {            startPointAnimation();        }        canvas.drawCircle(currentPoint.getX(), currentPoint.getY(), radius, paint);    }    //开始执行对Point对象操作的动画    private void startPointAnimation() {        Point startPoint = new Point(radius, radius);        Point endPoint = new Point(getWidth() - radius, getHeight() - radius);        currentPoint = startPoint;        //fraction是一个从0到1变化的值        ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator<Point>() {            @Override            public Point evaluate(float fraction, Point startValue, Point endValue) {                float startX = startValue.getX();                float endX = endValue.getX();                float currentX = startX + fraction * (endX - startX);                float startY = startValue.getY();                float endY = endValue.getY();                float currentY = startY + fraction * (endY - startY);                Log.e("tag", "===== " + currentY);                return new Point(currentX, currentY);            }        }, startPoint, endPoint);        //设置监听,获取当前的监听对象        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                currentPoint = (Point) animation.getAnimatedValue();                //重新绘制,   (改变了currentPoint之后去重新绘制圆)                invalidate();            }        });        //设置动画插值器,改变动画变化速率 , 加速,先加速后减速,弹跳效果        valueAnimator.setInterpolator(new BounceInterpolator());        valueAnimator.setDuration(2000);        valueAnimator.start();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //去画圆        drawCirle(canvas);    }}

Point类

public class Point {    float x;    float y;    public float getX() {        return x;    }    public void setX(float x) {        this.x = x;    }    public float getY() {        return y;    }    public void setY(float y) {        this.y = y;    }    public Point(float x, float y) {        this.x = x;        this.y = y;    }}

在XML布局文件中引用

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/relativeLayout"    tools:context="com.hgz.test.animator.MainActivity">    <ImageView        android:id="@+id/showIv"        android:layout_width="130dp"        android:layout_height="130dp"        android:layout_centerInParent="true"        android:src="@drawable/ic_stub"        android:visibility="gone"/>    <com.hgz.test.animator.MyCircleView        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>

原创粉丝点击