1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.apis.animation;
18 
19 // Need the following import to get access to the app resources, since this
20 // class is in a sub-package.
21 import android.animation.Animator;
22 import android.animation.ObjectAnimator;
23 import android.widget.CheckBox;
24 import android.widget.TextView;
25 import com.example.android.apis.R;
26 
27 import java.util.ArrayList;
28 
29 import android.animation.ValueAnimator;
30 import android.animation.AnimatorSet;
31 import android.app.Activity;
32 import android.content.Context;
33 import android.graphics.Canvas;
34 import android.graphics.Paint;
35 import android.graphics.RadialGradient;
36 import android.graphics.Shader;
37 import android.graphics.drawable.ShapeDrawable;
38 import android.graphics.drawable.shapes.OvalShape;
39 import android.os.Bundle;
40 import android.view.View;
41 import android.view.animation.AccelerateInterpolator;
42 import android.widget.Button;
43 import android.widget.LinearLayout;
44 
45 /**
46  * This demo shows how the AnimatorListener events work.
47  */
48 public class AnimatorEvents extends Activity {
49 
50     TextView startText, repeatText, cancelText, endText;
51     TextView startTextAnimator, repeatTextAnimator, cancelTextAnimator, endTextAnimator;
52 
53     @Override
onCreate(Bundle savedInstanceState)54     public void onCreate(Bundle savedInstanceState) {
55         super.onCreate(savedInstanceState);
56         setContentView(R.layout.animator_events);
57         LinearLayout container = (LinearLayout) findViewById(R.id.container);
58         final MyAnimationView animView = new MyAnimationView(this);
59         container.addView(animView);
60         startText = (TextView) findViewById(R.id.startText);
61         startText.setAlpha(.5f);
62         repeatText = (TextView) findViewById(R.id.repeatText);
63         repeatText.setAlpha(.5f);
64         cancelText = (TextView) findViewById(R.id.cancelText);
65         cancelText.setAlpha(.5f);
66         endText = (TextView) findViewById(R.id.endText);
67         endText.setAlpha(.5f);
68         startTextAnimator = (TextView) findViewById(R.id.startTextAnimator);
69         startTextAnimator.setAlpha(.5f);
70         repeatTextAnimator = (TextView) findViewById(R.id.repeatTextAnimator);
71         repeatTextAnimator.setAlpha(.5f);
72         cancelTextAnimator = (TextView) findViewById(R.id.cancelTextAnimator);
73         cancelTextAnimator.setAlpha(.5f);
74         endTextAnimator = (TextView) findViewById(R.id.endTextAnimator);
75         endTextAnimator.setAlpha(.5f);
76         final CheckBox endCB = (CheckBox) findViewById(R.id.endCB);
77 
78 
79         Button starter = (Button) findViewById(R.id.startButton);
80         starter.setOnClickListener(new View.OnClickListener() {
81 
82             public void onClick(View v) {
83                 animView.startAnimation(endCB.isChecked());
84             }
85         });
86 
87         Button canceler = (Button) findViewById(R.id.cancelButton);
88         canceler.setOnClickListener(new View.OnClickListener() {
89 
90             public void onClick(View v) {
91                 animView.cancelAnimation();
92             }
93         });
94 
95         Button ender = (Button) findViewById(R.id.endButton);
96         ender.setOnClickListener(new View.OnClickListener() {
97 
98             public void onClick(View v) {
99                 animView.endAnimation();
100             }
101         });
102 
103     }
104 
105     public class MyAnimationView extends View implements Animator.AnimatorListener,
106     ValueAnimator.AnimatorUpdateListener {
107 
108         public final ArrayList<ShapeHolder> balls = new ArrayList<ShapeHolder>();
109         Animator animation;
110         ShapeHolder ball = null;
111         boolean endImmediately = false;
112 
MyAnimationView(Context context)113         public MyAnimationView(Context context) {
114             super(context);
115             ball = createBall(25, 25);
116         }
117 
createAnimation()118         private void createAnimation() {
119             if (animation == null) {
120                 ObjectAnimator yAnim = ObjectAnimator.ofFloat(ball, "y",
121                         ball.getY(), getHeight() - 50f).setDuration(1500);
122                 yAnim.setRepeatCount(0);
123                 yAnim.setRepeatMode(ValueAnimator.REVERSE);
124                 yAnim.setInterpolator(new AccelerateInterpolator(2f));
125                 yAnim.addUpdateListener(this);
126                 yAnim.addListener(this);
127 
128                 ObjectAnimator xAnim = ObjectAnimator.ofFloat(ball, "x",
129                         ball.getX(), ball.getX() + 300).setDuration(1000);
130                 xAnim.setStartDelay(0);
131                 xAnim.setRepeatCount(0);
132                 xAnim.setRepeatMode(ValueAnimator.REVERSE);
133                 xAnim.setInterpolator(new AccelerateInterpolator(2f));
134 
135                 ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(ball, "alpha", 1f, .5f).
136                         setDuration(1000);
137                 AnimatorSet alphaSeq = new AnimatorSet();
138                 alphaSeq.play(alphaAnim);
139 
140                 animation = new AnimatorSet();
141                 ((AnimatorSet) animation).playTogether(yAnim, xAnim);
142                 animation.addListener(this);
143             }
144         }
145 
startAnimation(boolean endImmediately)146         public void startAnimation(boolean endImmediately) {
147             this.endImmediately = endImmediately;
148             startText.setAlpha(.5f);
149             repeatText.setAlpha(.5f);
150             cancelText.setAlpha(.5f);
151             endText.setAlpha(.5f);
152             startTextAnimator.setAlpha(.5f);
153             repeatTextAnimator.setAlpha(.5f);
154             cancelTextAnimator.setAlpha(.5f);
155             endTextAnimator.setAlpha(.5f);
156             createAnimation();
157             animation.start();
158         }
159 
cancelAnimation()160         public void cancelAnimation() {
161             createAnimation();
162             animation.cancel();
163         }
164 
endAnimation()165         public void endAnimation() {
166             createAnimation();
167             animation.end();
168         }
169 
createBall(float x, float y)170         private ShapeHolder createBall(float x, float y) {
171             OvalShape circle = new OvalShape();
172             circle.resize(50f, 50f);
173             ShapeDrawable drawable = new ShapeDrawable(circle);
174             ShapeHolder shapeHolder = new ShapeHolder(drawable);
175             shapeHolder.setX(x - 25f);
176             shapeHolder.setY(y - 25f);
177             int red = (int)(Math.random() * 255);
178             int green = (int)(Math.random() * 255);
179             int blue = (int)(Math.random() * 255);
180             int color = 0xff000000 | red << 16 | green << 8 | blue;
181             Paint paint = drawable.getPaint(); //new Paint(Paint.ANTI_ALIAS_FLAG);
182             int darkColor = 0xff000000 | red/4 << 16 | green/4 << 8 | blue/4;
183             RadialGradient gradient = new RadialGradient(37.5f, 12.5f,
184                     50f, color, darkColor, Shader.TileMode.CLAMP);
185             paint.setShader(gradient);
186             shapeHolder.setPaint(paint);
187             return shapeHolder;
188         }
189 
190         @Override
onDraw(Canvas canvas)191         protected void onDraw(Canvas canvas) {
192             canvas.save();
193             canvas.translate(ball.getX(), ball.getY());
194             ball.getShape().draw(canvas);
195             canvas.restore();
196         }
197 
onAnimationUpdate(ValueAnimator animation)198         public void onAnimationUpdate(ValueAnimator animation) {
199             invalidate();
200         }
201 
onAnimationStart(Animator animation)202         public void onAnimationStart(Animator animation) {
203             if (animation instanceof AnimatorSet) {
204                 startText.setAlpha(1f);
205             } else {
206                 startTextAnimator.setAlpha(1f);
207             }
208             if (endImmediately) {
209                 animation.end();
210             }
211         }
212 
onAnimationEnd(Animator animation)213         public void onAnimationEnd(Animator animation) {
214             if (animation instanceof AnimatorSet) {
215                 endText.setAlpha(1f);
216             } else {
217                 endTextAnimator.setAlpha(1f);
218             }
219         }
220 
onAnimationCancel(Animator animation)221         public void onAnimationCancel(Animator animation) {
222             if (animation instanceof AnimatorSet) {
223                 cancelText.setAlpha(1f);
224             } else {
225                 cancelTextAnimator.setAlpha(1f);
226             }
227         }
228 
onAnimationRepeat(Animator animation)229         public void onAnimationRepeat(Animator animation) {
230             if (animation instanceof AnimatorSet) {
231                 repeatText.setAlpha(1f);
232             } else {
233                 repeatTextAnimator.setAlpha(1f);
234             }
235         }
236     }
237 }