10366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase/*
20366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * Copyright (C) 2010 The Android Open Source Project
30366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase *
40366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
50366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * you may not use this file except in compliance with the License.
60366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * You may obtain a copy of the License at
70366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase *
80366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
90366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase *
100366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * Unless required by applicable law or agreed to in writing, software
110366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
120366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * See the License for the specific language governing permissions and
140366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase * limitations under the License.
150366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase */
160366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
170366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haasepackage com.example.android.apis.animation;
180366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
190366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase// Need the following import to get access to the app resources, since this
200366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase// class is in a sub-package.
21d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haaseimport android.animation.AnimatorInflater;
22d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haaseimport android.animation.AnimatorSet;
23d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haaseimport android.animation.ObjectAnimator;
248dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haaseimport android.graphics.Color;
250366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport com.example.android.apis.R;
260366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
270366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport java.util.ArrayList;
280366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
290366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.animation.Animator;
30d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haaseimport android.animation.ValueAnimator;
310366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.app.Activity;
320366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.content.Context;
330366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.graphics.Canvas;
340366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.graphics.Paint;
350366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.graphics.RadialGradient;
360366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.graphics.Shader;
370366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.graphics.drawable.ShapeDrawable;
380366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.graphics.drawable.shapes.OvalShape;
390366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.os.Bundle;
400366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.view.View;
410366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.widget.Button;
420366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haaseimport android.widget.LinearLayout;
430366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
440366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase/**
45d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase * This application demonstrates loading Animator objects from XML resources.
460366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase */
470366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haasepublic class AnimationLoading extends Activity {
480366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
490366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase    private static final int DURATION = 1500;
500366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
510366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase    /** Called when the activity is first created. */
520366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase    @Override
530366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase    public void onCreate(Bundle savedInstanceState) {
540366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        super.onCreate(savedInstanceState);
550366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        setContentView(R.layout.animation_loading);
560366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        LinearLayout container = (LinearLayout) findViewById(R.id.container);
570366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        final MyAnimationView animView = new MyAnimationView(this);
580366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        container.addView(animView);
590366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
600366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        Button starter = (Button) findViewById(R.id.startButton);
610366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        starter.setOnClickListener(new View.OnClickListener() {
620366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            public void onClick(View v) {
630366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                animView.startAnimation();
640366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            }
650366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        });
660366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase    }
670366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
68d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase    public class MyAnimationView extends View implements ValueAnimator.AnimatorUpdateListener {
690366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
700366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        private static final float BALL_SIZE = 100f;
710366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
720366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        public final ArrayList<ShapeHolder> balls = new ArrayList<ShapeHolder>();
73d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase        Animator animation = null;
740366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
750366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        public MyAnimationView(Context context) {
760366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            super(context);
778dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            addBall(50, 50);
788dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            addBall(200, 50);
798dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            addBall(350, 50);
808dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            addBall(500, 50, Color.GREEN);
810366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        }
820366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
830366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        private void createAnimation() {
8443b37134fd2060552a058ae6276f119f92186279Chet Haase            Context appContext = AnimationLoading.this;
8543b37134fd2060552a058ae6276f119f92186279Chet Haase
860366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            if (animation == null) {
878dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase                ObjectAnimator anim = (ObjectAnimator) AnimatorInflater.
8843b37134fd2060552a058ae6276f119f92186279Chet Haase                        loadAnimator(appContext, R.anim.object_animator);
890366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                anim.addUpdateListener(this);
900366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                anim.setTarget(balls.get(0));
910366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
928dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase                ValueAnimator fader = (ValueAnimator) AnimatorInflater.
9343b37134fd2060552a058ae6276f119f92186279Chet Haase                        loadAnimator(appContext, R.anim.animator);
94d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase                fader.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
95d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase                    public void onAnimationUpdate(ValueAnimator animation) {
960366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                        balls.get(1).setAlpha((Float) animation.getAnimatedValue());
970366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                    }
980366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                });
990366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
100d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase                AnimatorSet seq =
10143b37134fd2060552a058ae6276f119f92186279Chet Haase                        (AnimatorSet) AnimatorInflater.loadAnimator(appContext,
102d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase                        R.anim.animator_set);
1030366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                seq.setTarget(balls.get(2));
1040366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
1058dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase                ObjectAnimator colorizer = (ObjectAnimator) AnimatorInflater.
10643b37134fd2060552a058ae6276f119f92186279Chet Haase                        loadAnimator(appContext, R.anim.color_animator);
1078dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase                colorizer.setTarget(balls.get(3));
1088dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase
109d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase                animation = new AnimatorSet();
1108dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase                ((AnimatorSet) animation).playTogether(anim, fader, seq, colorizer);
1110366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            }
1120366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        }
1130366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
1140366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        public void startAnimation() {
1150366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            createAnimation();
1160366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            animation.start();
1170366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        }
1180366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
1198dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase        private ShapeHolder createBall(float x, float y) {
1200366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            OvalShape circle = new OvalShape();
1210366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            circle.resize(BALL_SIZE, BALL_SIZE);
1220366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            ShapeDrawable drawable = new ShapeDrawable(circle);
1230366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            ShapeHolder shapeHolder = new ShapeHolder(drawable);
1240366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            shapeHolder.setX(x);
1250366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            shapeHolder.setY(y);
1268dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            return shapeHolder;
1278dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase        }
1288dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase
1298dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase        private void addBall(float x, float y, int color) {
1308dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            ShapeHolder shapeHolder = createBall(x, y);
1318dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            shapeHolder.setColor(color);
1328dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            balls.add(shapeHolder);
1338dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase        }
1348dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase
1358dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase        private void addBall(float x, float y) {
1368dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            ShapeHolder shapeHolder = createBall(x, y);
1370366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            int red = (int)(100 + Math.random() * 155);
1380366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            int green = (int)(100 + Math.random() * 155);
1390366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            int blue = (int)(100 + Math.random() * 155);
1400366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            int color = 0xff000000 | red << 16 | green << 8 | blue;
1418dfaaa2ffd5a53146c035b2dc6ec904b7ad3da16Chet Haase            Paint paint = shapeHolder.getShape().getPaint();
1420366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            int darkColor = 0xff000000 | red/4 << 16 | green/4 << 8 | blue/4;
1430366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            RadialGradient gradient = new RadialGradient(37.5f, 12.5f,
1440366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                    50f, color, darkColor, Shader.TileMode.CLAMP);
1450366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            paint.setShader(gradient);
1460366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            balls.add(shapeHolder);
1470366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        }
1480366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
1490366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        @Override
1500366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        protected void onDraw(Canvas canvas) {
1510366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            for (ShapeHolder ball : balls) {
1520366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                canvas.translate(ball.getX(), ball.getY());
1530366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                ball.getShape().draw(canvas);
1540366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase                canvas.translate(-ball.getX(), -ball.getY());
1550366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            }
1560366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        }
1570366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
158d9855a8dbed211de6e1c1cf55e20201349c40432Chet Haase        public void onAnimationUpdate(ValueAnimator animation) {
1590366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase
1600366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            invalidate();
1610366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            ShapeHolder ball = balls.get(0);
1620366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase            ball.setY((Float)animation.getAnimatedValue());
1630366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase        }
1640366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase    }
1650366ddf4d394c7b8dc663646de5f5b79ab672b71Chet Haase}