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 17 package com.android.test.hwui; 18 19 import android.app.Activity; 20 import android.content.Context; 21 import android.graphics.Canvas; 22 import android.graphics.CanvasProperty; 23 import android.graphics.Paint; 24 import android.graphics.Paint.Style; 25 import android.graphics.RecordingCanvas; 26 import android.os.Bundle; 27 import android.os.Trace; 28 import android.view.RenderNodeAnimator; 29 import android.view.View; 30 import android.widget.LinearLayout; 31 import android.widget.LinearLayout.LayoutParams; 32 import android.widget.ProgressBar; 33 34 import java.util.ArrayList; 35 36 public class CirclePropActivity extends Activity { 37 @Override onCreate(Bundle savedInstanceState)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 // For testing with a functor in the tree 47 // WebView wv = new WebView(this); 48 // wv.setWebViewClient(new WebViewClient()); 49 // wv.setWebChromeClient(new WebChromeClient()); 50 // wv.loadUrl("http://theverge.com"); 51 // layout.addView(wv, new LayoutParams(LayoutParams.MATCH_PARENT, 100)); 52 53 layout.addView(new CircleView(this), 54 new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 55 56 setContentView(layout); 57 } 58 59 static class CircleView extends View { 60 static final int DURATION = 500; 61 62 private boolean mToggle = false; 63 ArrayList<RenderNodeAnimator> mRunningAnimations = new ArrayList<RenderNodeAnimator>(); 64 65 CanvasProperty<Float> mX; 66 CanvasProperty<Float> mY; 67 CanvasProperty<Float> mRadius; 68 CanvasProperty<Paint> mPaint; 69 CircleView(Context c)70 CircleView(Context c) { 71 super(c); 72 setClickable(true); 73 74 mX = CanvasProperty.createFloat(200.0f); 75 mY = CanvasProperty.createFloat(200.0f); 76 mRadius = CanvasProperty.createFloat(150.0f); 77 78 Paint p = new Paint(); 79 p.setAntiAlias(true); 80 p.setColor(0xFFFF0000); 81 p.setStyle(Style.STROKE); 82 p.setStrokeWidth(60.0f); 83 mPaint = CanvasProperty.createPaint(p); 84 } 85 86 @Override onDraw(Canvas canvas)87 protected void onDraw(Canvas canvas) { 88 super.onDraw(canvas); 89 90 if (canvas.isHardwareAccelerated()) { 91 RecordingCanvas recordingCanvas = (RecordingCanvas) canvas; 92 recordingCanvas.drawCircle(mX, mY, mRadius, mPaint); 93 } 94 } 95 96 @Override performClick()97 public boolean performClick() { 98 for (int i = 0; i < mRunningAnimations.size(); i++) { 99 mRunningAnimations.get(i).cancel(); 100 } 101 mRunningAnimations.clear(); 102 103 mToggle = !mToggle; 104 105 mRunningAnimations.add(new RenderNodeAnimator( 106 mX, mToggle ? 400.0f : 200.0f)); 107 108 mRunningAnimations.add(new RenderNodeAnimator( 109 mY, mToggle ? 600.0f : 200.0f)); 110 111 mRunningAnimations.add(new RenderNodeAnimator( 112 mRadius, mToggle ? 250.0f : 150.0f)); 113 114 mRunningAnimations.add(new RenderNodeAnimator( 115 mPaint, RenderNodeAnimator.PAINT_STROKE_WIDTH, 116 mToggle ? 5.0f : 60.0f)); 117 118 mRunningAnimations.add(new RenderNodeAnimator( 119 mPaint, RenderNodeAnimator.PAINT_ALPHA, 64.0f)); 120 121 // Will be "chained" to run after the above 122 mRunningAnimations.add(new RenderNodeAnimator( 123 mPaint, RenderNodeAnimator.PAINT_ALPHA, 255.0f)); 124 125 for (int i = 0; i < mRunningAnimations.size(); i++) { 126 RenderNodeAnimator anim = mRunningAnimations.get(i); 127 anim.setDuration(1000); 128 anim.setTarget(this); 129 if (i == (mRunningAnimations.size() - 1)) { 130 // "chain" test 131 anim.setStartValue(64.0f); 132 anim.setStartDelay(anim.getDuration()); 133 } 134 anim.start(); 135 } 136 137 if (mToggle) { 138 post(new Runnable() { 139 @Override 140 public void run() { 141 Trace.traceBegin(Trace.TRACE_TAG_VIEW, "pretendBusy"); 142 try { 143 Thread.sleep(DURATION); 144 } catch (InterruptedException e) { 145 } 146 Trace.traceEnd(Trace.TRACE_TAG_VIEW); 147 } 148 }); 149 } 150 return true; 151 } 152 } 153 } 154