1d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck/* 2d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * Copyright (C) 2014 The Android Open Source Project 3d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * 4d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * you may not use this file except in compliance with the License. 6d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * You may obtain a copy of the License at 7d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * 8d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * 10d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * Unless required by applicable law or agreed to in writing, software 11d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * See the License for the specific language governing permissions and 14d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck * limitations under the License. 15d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck */ 16d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 17d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckpackage com.android.test.hwui; 18d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 19c01bd1167a1b08d59557f214ddc48cf24d3b8d0aJohn Reckimport android.animation.Animator; 20c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reckimport android.animation.Animator.AnimatorListener; 21f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reckimport android.animation.AnimatorSet; 22d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.app.Activity; 23d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.content.Context; 24d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.graphics.Canvas; 25d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.graphics.Color; 26d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.os.Bundle; 27c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reckimport android.util.Log; 28d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.view.View; 29d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.view.View.OnClickListener; 30d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.view.ViewAnimationUtils; 31d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.widget.LinearLayout; 32d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.widget.LinearLayout.LayoutParams; 33d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.widget.ProgressBar; 34d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 35d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckpublic class RevealActivity extends Activity implements OnClickListener { 36d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 37d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private static final int DURATION = 800; 38d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 39d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private boolean mShouldBlock; 40f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck private int mIteration = 0; 41d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 42c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck private AnimatorListener mListener = new AnimatorListener() { 43c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck 44c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck @Override 45c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck public void onAnimationStart(Animator animation) { 46c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck Log.d("Reveal", "onAnimatorStart " + animation); 47c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck } 48c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck 49c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck @Override 50c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck public void onAnimationRepeat(Animator animation) { 51c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck Log.d("Reveal", "onAnimationRepeat " + animation); 52c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck } 53c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck 54c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck @Override 55c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck public void onAnimationEnd(Animator animation) { 56c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck Log.d("Reveal", "onAnimationEnd " + animation); 57c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck } 58c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck 59c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck @Override 60c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck public void onAnimationCancel(Animator animation) { 61c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck Log.d("Reveal", "onAnimationCancel " + animation); 62c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck } 63c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck }; 64c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck 65d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 66d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck protected void onCreate(Bundle savedInstanceState) { 67d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.onCreate(savedInstanceState); 68d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 69d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck final LinearLayout layout = new LinearLayout(this); 70d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck layout.setOrientation(LinearLayout.VERTICAL); 71d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 72d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck ProgressBar spinner = new ProgressBar(this, null, android.R.attr.progressBarStyleLarge); 73d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck layout.addView(spinner, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 74d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck View revealView = new MyView(this); 75d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck layout.addView(revealView, 76d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 77d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck setContentView(layout); 78d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 79d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck revealView.setOnClickListener(this); 80d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 81d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 82d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 83d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void onClick(View view) { 84c01bd1167a1b08d59557f214ddc48cf24d3b8d0aJohn Reck Animator animator = ViewAnimationUtils.createCircularReveal(view, 85d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck view.getWidth() / 2, view.getHeight() / 2, 86d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 0, Math.max(view.getWidth(), view.getHeight())); 87c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck Log.d("Reveal", "Calling start..."); 88c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck animator.addListener(mListener); 89f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck if (mIteration < 2) { 90f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck animator.setDuration(DURATION); 91f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck animator.start(); 92f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck } else { 93f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck AnimatorSet set = new AnimatorSet(); 94f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck set.playTogether(animator); 95f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck set.setDuration(DURATION); 96c47c98be04d602f331e0ea9704d2c11f8c53852dJohn Reck set.addListener(mListener); 97f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck set.start(); 98f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck } 99d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 100f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck mIteration = (mIteration + 1) % 4; 101d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mShouldBlock = !mShouldBlock; 102d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mShouldBlock) { 103d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck view.post(sBlockThread); 104d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 105d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 106d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 107d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private final static Runnable sBlockThread = new Runnable() { 108d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 109d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void run() { 110d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck try { 111d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck Thread.sleep(DURATION); 112d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } catch (InterruptedException e) { 113d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 114d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 115d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck }; 116d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 117d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck static class MyView extends View { 118d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 119d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public MyView(Context context) { 120d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super(context); 121d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 122d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 123d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 124d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck protected void onDraw(Canvas canvas) { 125d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck canvas.drawColor(Color.RED); 126d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 127d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 128d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck} 129