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}