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