CirclePropActivity.java revision 52244fff29042926e21fa897ef5ab11148e35299
1/* 2 * Copyright (C) 2014 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 17package com.android.test.hwui; 18 19import android.app.Activity; 20import android.content.Context; 21import android.graphics.Canvas; 22import android.graphics.CanvasProperty; 23import android.graphics.Paint; 24import android.graphics.Paint.Style; 25import android.os.Bundle; 26import android.os.Trace; 27import android.view.HardwareCanvas; 28import android.view.RenderNodeAnimator; 29import android.view.View; 30import android.widget.LinearLayout; 31import android.widget.LinearLayout.LayoutParams; 32import android.widget.ProgressBar; 33 34import java.util.ArrayList; 35 36public class CirclePropActivity extends Activity { 37 @Override 38 protected void onCreate(Bundle savedInstanceState) { 39 super.onCreate(savedInstanceState); 40 41 final LinearLayout layout = new LinearLayout(this); 42 layout.setOrientation(LinearLayout.VERTICAL); 43 44 ProgressBar spinner = new ProgressBar(this, null, android.R.attr.progressBarStyleLarge); 45 layout.addView(spinner, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 46 47 layout.addView(new CircleView(this), 48 new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 49 50 setContentView(layout); 51 } 52 53 static class CircleView extends View { 54 static final int DURATION = 500; 55 56 private boolean mToggle = false; 57 ArrayList<RenderNodeAnimator> mRunningAnimations = new ArrayList<RenderNodeAnimator>(); 58 59 CanvasProperty<Float> mX; 60 CanvasProperty<Float> mY; 61 CanvasProperty<Float> mRadius; 62 CanvasProperty<Paint> mPaint; 63 64 CircleView(Context c) { 65 super(c); 66 setClickable(true); 67 68 mX = CanvasProperty.createFloat(200.0f); 69 mY = CanvasProperty.createFloat(200.0f); 70 mRadius = CanvasProperty.createFloat(150.0f); 71 72 Paint p = new Paint(); 73 p.setAntiAlias(true); 74 p.setColor(0xFFFF0000); 75 p.setStyle(Style.STROKE); 76 p.setStrokeWidth(60.0f); 77 mPaint = CanvasProperty.createPaint(p); 78 } 79 80 @Override 81 protected void onDraw(Canvas canvas) { 82 super.onDraw(canvas); 83 84 if (canvas.isHardwareAccelerated()) { 85 HardwareCanvas hwcanvas = (HardwareCanvas) canvas; 86 hwcanvas.drawCircle(mX, mY, mRadius, mPaint); 87 } 88 } 89 90 @Override 91 public boolean performClick() { 92 for (int i = 0; i < mRunningAnimations.size(); i++) { 93 mRunningAnimations.get(i).cancel(); 94 } 95 mRunningAnimations.clear(); 96 97 mToggle = !mToggle; 98 99 mRunningAnimations.add(new RenderNodeAnimator( 100 mX, RenderNodeAnimator.DELTA_TYPE_ABSOLUTE, mToggle ? 400.0f : 200.0f)); 101 102 mRunningAnimations.add(new RenderNodeAnimator( 103 mY, RenderNodeAnimator.DELTA_TYPE_ABSOLUTE, mToggle ? 600.0f : 200.0f)); 104 105 mRunningAnimations.add(new RenderNodeAnimator( 106 mRadius, RenderNodeAnimator.DELTA_TYPE_ABSOLUTE, mToggle ? 250.0f : 150.0f)); 107 108 mRunningAnimations.add(new RenderNodeAnimator( 109 mPaint, RenderNodeAnimator.PAINT_ALPHA, 110 RenderNodeAnimator.DELTA_TYPE_ABSOLUTE, mToggle ? 64.0f : 255.0f)); 111 112 mRunningAnimations.add(new RenderNodeAnimator( 113 mPaint, RenderNodeAnimator.PAINT_STROKE_WIDTH, 114 RenderNodeAnimator.DELTA_TYPE_ABSOLUTE, mToggle ? 5.0f : 60.0f)); 115 116 for (int i = 0; i < mRunningAnimations.size(); i++) { 117 mRunningAnimations.get(i).start(this); 118 } 119 120 if (mToggle) { 121 post(new Runnable() { 122 @Override 123 public void run() { 124 Trace.traceBegin(Trace.TRACE_TAG_VIEW, "pretendBusy"); 125 try { 126 Thread.sleep(DURATION); 127 } catch (InterruptedException e) { 128 } 129 Trace.traceEnd(Trace.TRACE_TAG_VIEW); 130 } 131 }); 132 } 133 134 return true; 135 } 136 } 137} 138