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