196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy/* 296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * Copyright (C) 2010 The Android Open Source Project 396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * 496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * you may not use this file except in compliance with the License. 696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * You may obtain a copy of the License at 796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * 896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * 1096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * Unless required by applicable law or agreed to in writing, software 1196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 1296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * See the License for the specific language governing permissions and 1496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * limitations under the License. 1596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy */ 1696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 1796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guypackage com.android.test.hwui; 1896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 1996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.app.Activity; 2096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.content.Context; 2196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.graphics.Canvas; 2296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.graphics.Paint; 2396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.graphics.Path; 2496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.os.Bundle; 2596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.util.Log; 2696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.view.View; 2796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 2896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport java.util.ArrayList; 2996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport java.util.Random; 3096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 3196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy@SuppressWarnings({"UnusedDeclaration"}) 3296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guypublic class PathsCacheActivity extends Activity { 3396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy private Path mPath; 3496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 3596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy private final Random mRandom = new Random(); 365dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") 3796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy private final ArrayList<Path> mPathList = new ArrayList<Path>(); 3896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 3996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy @Override 4096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy protected void onCreate(Bundle savedInstanceState) { 4196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy super.onCreate(savedInstanceState); 4296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 4396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPath = makePath(); 4496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 4596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy final PathsView view = new PathsView(this); 4696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy setContentView(view); 4796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy } 4896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 49ca89e2a68703bd428e8b66547d033a6ed35b3595Romain Guy private static Path makePath() { 5096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy Path path = new Path(); 5196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy buildPath(path); 5296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy return path; 5396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy } 5496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 55ca89e2a68703bd428e8b66547d033a6ed35b3595Romain Guy private static void buildPath(Path path) { 5696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy path.moveTo(0.0f, 0.0f); 5796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy path.cubicTo(0.0f, 0.0f, 100.0f, 150.0f, 100.0f, 200.0f); 5896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy path.cubicTo(100.0f, 200.0f, 50.0f, 300.0f, -80.0f, 200.0f); 5996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy path.cubicTo(-80.0f, 200.0f, 100.0f, 200.0f, 200.0f, 0.0f); 6096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy } 6196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy private static Path makeLargePath() { 635dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy Path path = new Path(); 645dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy buildLargePath(path); 655dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy return path; 665dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy } 675dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 685dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy private static void buildLargePath(Path path) { 695dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy path.moveTo(0.0f, 0.0f); 705dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy path.cubicTo(0.0f, 0.0f, 10000.0f, 15000.0f, 10000.0f, 20000.0f); 715dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy path.cubicTo(10000.0f, 20000.0f, 5000.0f, 30000.0f, -8000.0f, 20000.0f); 725dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy path.cubicTo(-8000.0f, 20000.0f, 10000.0f, 20000.0f, 20000.0f, 0.0f); 735dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy } 745dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 7596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy public class PathsView extends View { 7696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy private final Paint mMediumPaint; 7796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 7896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy public PathsView(Context c) { 7996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy super(c); 8096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 8196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mMediumPaint = new Paint(); 8296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mMediumPaint.setAntiAlias(true); 8396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mMediumPaint.setColor(0xe00000ff); 8496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mMediumPaint.setStrokeWidth(10.0f); 8596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mMediumPaint.setStyle(Paint.Style.STROKE); 8696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy } 8796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 8896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy @Override 8996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy protected void onDraw(Canvas canvas) { 9096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy super.onDraw(canvas); 9196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 9296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy canvas.drawARGB(255, 255, 255, 255); 9396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 9496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy canvas.save(); 9596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy canvas.translate(550.0f, 60.0f); 9696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy canvas.drawPath(mPath, mMediumPaint); 975d923200846ed59e813373bde789d97d4ccc40b5Romain Guy 985d923200846ed59e813373bde789d97d4ccc40b5Romain Guy mPath.reset(); 995d923200846ed59e813373bde789d97d4ccc40b5Romain Guy buildPath(mPath); 1005d923200846ed59e813373bde789d97d4ccc40b5Romain Guy 1015d923200846ed59e813373bde789d97d4ccc40b5Romain Guy canvas.translate(30.0f, 30.0f); 1025d923200846ed59e813373bde789d97d4ccc40b5Romain Guy canvas.drawPath(mPath, mMediumPaint); 1035d923200846ed59e813373bde789d97d4ccc40b5Romain Guy canvas.drawPath(mPath, mMediumPaint); 10496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 10596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPath.reset(); 10696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy buildPath(mPath); 10796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 10896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy canvas.translate(30.0f, 30.0f); 10996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy canvas.drawPath(mPath, mMediumPaint); 11096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy canvas.drawPath(mPath, mMediumPaint); 11196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 11296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy canvas.restore(); 11396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy 1144bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy for (int i = 0; i < mRandom.nextInt(20); i++) { 1154bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy Path path = makePath(); 1164bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy int r = mRandom.nextInt(10); 1174bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy if (r == 5 || r == 3) { 1184bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy mPathList.add(path); 1195dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy } else if (r == 7) { 1205dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy path = makeLargePath(); 1215dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy mPathList.add(path); 1224bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy } 1234bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy 1244bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy canvas.save(); 1254bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy canvas.translate(450.0f + mRandom.nextInt(200), mRandom.nextInt(200)); 1264bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy canvas.drawPath(path, mMediumPaint); 1274bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy canvas.restore(); 1284bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy } 1294bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy 1304bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy int r = mRandom.nextInt(100); 1314bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy if (r == 50) { 1324bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy mPathList.clear(); 1334bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy } 1344bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy 13596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy invalidate(); 13696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy } 13796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy } 13896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy} 139