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