17fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy/* 27fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * Copyright (C) 2010 The Android Open Source Project 37fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * 47fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 57fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * you may not use this file except in compliance with the License. 67fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * You may obtain a copy of the License at 77fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * 87fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 97fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * 107fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * Unless required by applicable law or agreed to in writing, software 117fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 127fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * See the License for the specific language governing permissions and 147fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * limitations under the License. 157fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy */ 167fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 17f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guypackage com.android.test.hwui; 187fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 197fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.app.Activity; 207fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.content.Context; 217fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.graphics.Bitmap; 227fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.graphics.BitmapFactory; 237fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.graphics.BitmapShader; 247fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.graphics.Canvas; 257fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.graphics.Paint; 267fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.graphics.Path; 277fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.graphics.RectF; 287fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.os.Bundle; 297fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyimport android.view.View; 307fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 317fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy@SuppressWarnings({"UnusedDeclaration"}) 327fbcc0492fca03857e3c45064f4aa040af817d55Romain Guypublic class PathsActivity extends Activity { 337fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy @Override 347fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy protected void onCreate(Bundle savedInstanceState) { 357fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy super.onCreate(savedInstanceState); 367fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy final PathsView view = new PathsView(this); 377fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy setContentView(view); 387fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy } 397fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 40d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public static class PathsView extends View { 417fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final Bitmap mBitmap1; 427fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final Paint mSmallPaint; 437fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final Paint mMediumPaint; 447fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final Paint mLargePaint; 457fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final BitmapShader mShader; 467fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final Path mPath; 477fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final RectF mPathBounds; 487fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final Paint mBoundsPaint; 497fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final Bitmap mBitmap; 507fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final float mOffset; 517fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy private final Paint mLinePaint; 527fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 53d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public PathsView(Context c) { 547fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy super(c); 557fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 567fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mBitmap1 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1); 577fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 587fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mSmallPaint = new Paint(); 597fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mSmallPaint.setAntiAlias(true); 607fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mSmallPaint.setColor(0xffff0000); 617fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mSmallPaint.setStrokeWidth(1.0f); 627fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mSmallPaint.setStyle(Paint.Style.STROKE); 63d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet 647fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLinePaint = new Paint(); 657fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLinePaint.setAntiAlias(true); 667fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLinePaint.setColor(0xffff00ff); 677fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLinePaint.setStrokeWidth(1.0f); 687fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLinePaint.setStyle(Paint.Style.STROKE); 697fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 707fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mMediumPaint = new Paint(); 717fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mMediumPaint.setAntiAlias(true); 726c319ca1275c8db892c39b48fc54864c949f9171Romain Guy mMediumPaint.setColor(0xe00000ff); 737fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mMediumPaint.setStrokeWidth(10.0f); 747fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mMediumPaint.setStyle(Paint.Style.STROKE); 757fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 767fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLargePaint = new Paint(); 777fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLargePaint.setAntiAlias(true); 78740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy mLargePaint.setColor(0x7f00ff00); 797fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLargePaint.setStrokeWidth(15.0f); 807fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLargePaint.setStyle(Paint.Style.FILL); 817fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 827fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mShader = new BitmapShader(mBitmap1, BitmapShader.TileMode.MIRROR, 837fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy BitmapShader.TileMode.MIRROR); 847fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 857fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mPath = new Path(); 867fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mPath.moveTo(0.0f, 0.0f); 877fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mPath.cubicTo(0.0f, 0.0f, 100.0f, 150.0f, 100.0f, 200.0f); 887fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mPath.cubicTo(100.0f, 200.0f, 50.0f, 300.0f, -80.0f, 200.0f); 897fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mPath.cubicTo(-80.0f, 200.0f, 100.0f, 200.0f, 200.0f, 0.0f); 907fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 917fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mPathBounds = new RectF(); 927fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mPath.computeBounds(mPathBounds, true); 937fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 947fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mBoundsPaint = new Paint(); 957fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mBoundsPaint.setColor(0x4000ff00); 967fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 977fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mOffset = mMediumPaint.getStrokeWidth(); 987fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy final int width = (int) (mPathBounds.width() + mOffset * 3.0f + 0.5f); 997fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy final int height = (int) (mPathBounds.height() + mOffset * 3.0f + 0.5f); 1007fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8); 1017fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy Canvas canvas = new Canvas(mBitmap); 1027fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.translate(-mPathBounds.left + mOffset * 1.5f, -mPathBounds.top + mOffset * 1.5f); 1037fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawPath(mPath, mMediumPaint); 1040965a3244b4c3009d08db2e084cdcb681ef66d26Romain Guy canvas.setBitmap(null); 1057fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy } 1067fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 1077fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy @Override 1087fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy protected void onDraw(Canvas canvas) { 1097fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy super.onDraw(canvas); 1107fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 1117fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawARGB(255, 255, 255, 255); 1127fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 1137fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.save(); 1147fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.translate(200.0f, 60.0f); 1157fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawPath(mPath, mSmallPaint); 116d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet 1177fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.translate(350.0f, 0.0f); 1187fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawPath(mPath, mMediumPaint); 1197fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 1207fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLargePaint.setShader(mShader); 1217fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.translate(350.0f, 0.0f); 1227fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawPath(mPath, mLargePaint); 1237fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLargePaint.setShader(null); 1247fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.restore(); 125d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet 1267fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.save(); 1277fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.translate(200.0f, 360.0f); 1287fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawPath(mPath, mSmallPaint); 1297fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawRect(mPathBounds, mBoundsPaint); 130d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet 1317fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.translate(350.0f, 0.0f); 1327fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawBitmap(mBitmap, mPathBounds.left - mOffset * 1.5f, 1337fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mPathBounds.top - mOffset * 1.5f, null); 1347fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawRect(mPathBounds, mBoundsPaint); 1357fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawLine(0.0f, -360.0f, 0.0f, 500.0f, mLinePaint); 1367fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 1377fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLargePaint.setShader(mShader); 1387fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.translate(350.0f, 0.0f); 1397fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawPath(mPath, mLargePaint); 1407fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.drawRect(mPathBounds, mBoundsPaint); 1417fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy mLargePaint.setShader(null); 1427fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy canvas.restore(); 1437fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy } 1447fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy } 1457fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy} 146