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