GradientsActivity.java revision e3095e0c1e2a4a4f34f741aa386eae56536ca5aa
10bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy/*
20bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * Copyright (C) 2010 The Android Open Source Project
30bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy *
40bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
50bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * you may not use this file except in compliance with the License.
60bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * You may obtain a copy of the License at
70bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy *
80bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
90bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy *
100bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * Unless required by applicable law or agreed to in writing, software
110bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
120bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * See the License for the specific language governing permissions and
140bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * limitations under the License.
150bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy */
160bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
170bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guypackage com.android.test.hwui;
180bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
190bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.app.Activity;
200bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.content.Context;
210bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.graphics.Canvas;
220bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.graphics.LinearGradient;
230bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.graphics.Matrix;
240bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.graphics.Paint;
250bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.graphics.Shader;
260bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.os.Bundle;
27e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guyimport android.view.Gravity;
280bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guyimport android.view.View;
29e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guyimport android.widget.FrameLayout;
30e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guyimport android.widget.SeekBar;
310bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
320bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy@SuppressWarnings({"UnusedDeclaration"})
330bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guypublic class GradientsActivity extends Activity {
340bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy    @Override
350bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy    protected void onCreate(Bundle savedInstanceState) {
360bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        super.onCreate(savedInstanceState);
370bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
38e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        final FrameLayout layout = new FrameLayout(this);
39e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        final ShadersView shadersView = new ShadersView(this);
40e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        final GradientView gradientView = new GradientView(this);
41e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        final SeekBar rotateView = new SeekBar(this);
42e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        rotateView.setMax(360);
43e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        rotateView.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
44e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            @Override
45e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            public void onStopTrackingTouch(SeekBar seekBar) {
46e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            }
47e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
48e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            @Override
49e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            public void onStartTrackingTouch(SeekBar seekBar) {
50e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            }
51e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
52e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            @Override
53e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
54e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy                gradientView.setRotationY((float)progress);
55e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            }
56e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        });
57e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
58e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        layout.addView(shadersView);
59e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        layout.addView(gradientView, new FrameLayout.LayoutParams(
60e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy                200, 200, Gravity.CENTER));
61e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        layout.addView(rotateView, new FrameLayout.LayoutParams(
62e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy                300, FrameLayout.LayoutParams.WRAP_CONTENT,
63e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy                Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
64e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
65e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        setContentView(layout);
66e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy    }
67e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
68e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy    static class GradientView extends View {
69e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        private final Paint mPaint;
70e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
71e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        GradientView(Context c) {
72e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            super(c);
73e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
74e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            LinearGradient gradient = new LinearGradient(0, 0, 200, 0, 0xFF000000, 0,
75e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy                    Shader.TileMode.CLAMP);
76e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            mPaint = new Paint();
77e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            mPaint.setShader(gradient);
78e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        }
79e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
80e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        @Override
81e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
82e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
83e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            setMeasuredDimension(200, 200);
84e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        }
85e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy
86e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        @Override
87e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        protected void onDraw(Canvas canvas) {
88e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            super.onDraw(canvas);
89e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy            canvas.drawRect(0.0f, 0.0f, getWidth(), getHeight(), mPaint);
90e3095e0c1e2a4a4f34f741aa386eae56536ca5aaRomain Guy        }
910bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy    }
920bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
930bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy    static class ShadersView extends View {
940bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        private final Paint mPaint;
950bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        private final float mDrawWidth;
960bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        private final float mDrawHeight;
970bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        private final LinearGradient mGradient;
980bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        private final Matrix mMatrix;
990bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1000bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        ShadersView(Context c) {
1010bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            super(c);
1020bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1030bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mDrawWidth = 200;
1040bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mDrawHeight = 200;
1050bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1060bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mGradient = new LinearGradient(0, 0, 0, 1, 0xFF000000, 0, Shader.TileMode.CLAMP);
1070bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix = new Matrix();
1080bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1090bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mPaint = new Paint();
1100bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        }
1110bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1120bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        @Override
1130bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        protected void onDraw(Canvas canvas) {
1140bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            super.onDraw(canvas);
1150bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            canvas.drawRGB(255, 255, 255);
1160bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1170bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            // Gradients
1180bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            canvas.save();
1190bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            float top = 40.0f;
1200bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            float right = 40.0f + mDrawWidth;
1210bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            float left = 40.0f;
1220bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            float bottom = 40.0f + mDrawHeight;
1230bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1240bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mPaint.setShader(mGradient);
1250bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1260bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.setScale(1, mDrawWidth);
1270bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.postRotate(90);
1280bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.postTranslate(right, top);
1290bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mGradient.setLocalMatrix(mMatrix);
1300bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            canvas.drawRect(right - mDrawWidth, top, right, top + mDrawHeight, mPaint);
1310bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1320bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            top += 40.0f + mDrawHeight;
1330bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            bottom += 40.0f + mDrawHeight;
1340bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1350bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.setScale(1, mDrawHeight);
1360bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.postTranslate(left, top);
1370bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mGradient.setLocalMatrix(mMatrix);
1380bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            canvas.drawRect(left, top, right, top + mDrawHeight, mPaint);
1390bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1400bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            left += 40.0f + mDrawWidth;
1410bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            right += 40.0f + mDrawWidth;
1420bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            top -= 40.0f + mDrawHeight;
1430bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            bottom -= 40.0f + mDrawHeight;
1440bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1450bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.setScale(1, mDrawHeight);
1460bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.postRotate(180);
1470bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.postTranslate(left, bottom);
1480bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mGradient.setLocalMatrix(mMatrix);
1490bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            canvas.drawRect(left, bottom - mDrawHeight, right, bottom, mPaint);
1500bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1510bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            top += 40.0f + mDrawHeight;
1520bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            bottom += 40.0f + mDrawHeight;
1530bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1540bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.setScale(1, mDrawWidth);
1550bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.postRotate(-90);
1560bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mMatrix.postTranslate(left, top);
1570bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mGradient.setLocalMatrix(mMatrix);
1580bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            canvas.drawRect(left, top, left + mDrawWidth, bottom, mPaint);
1590bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy
1600bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            canvas.restore();
1610bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy        }
1620bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy    }
1630bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy}
164