TextOnPathActivity.java revision 9777173eb6c9eb97c7921c8288ebc65e3ab3ce6f
1325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy/* 2325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * Copyright (C) 2010 The Android Open Source Project 3325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * 4325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * you may not use this file except in compliance with the License. 6325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * You may obtain a copy of the License at 7325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * 8325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * 10325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * Unless required by applicable law or agreed to in writing, software 11325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * See the License for the specific language governing permissions and 14325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy * limitations under the License. 15325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy */ 16325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 17325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guypackage com.android.test.hwui; 18325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 19325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyimport android.app.Activity; 20325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyimport android.content.Context; 21325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyimport android.graphics.Canvas; 22325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyimport android.graphics.Paint; 23325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyimport android.graphics.Path; 249777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guyimport android.graphics.PathMeasure; 25325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyimport android.os.Bundle; 26325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyimport android.view.View; 27325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 28325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy@SuppressWarnings({"UnusedDeclaration"}) 29325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guypublic class TextOnPathActivity extends Activity { 30325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy private Path mPath; 319777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private Path mStraightPath; 32325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 33325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy @Override 34325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy protected void onCreate(Bundle savedInstanceState) { 35325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy super.onCreate(savedInstanceState); 36325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 37325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy mPath = makePath(); 389777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mStraightPath = makeStraightPath(); 39325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 40325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy final TextOnPathView view = new TextOnPathView(this); 41325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy setContentView(view); 42325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 43325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 44325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy private Path makePath() { 45325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy Path path = new Path(); 46325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy buildPath(path); 47325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy return path; 48325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 49325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 50325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy private void buildPath(Path path) { 51325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy path.moveTo(0.0f, 0.0f); 52325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy path.cubicTo(0.0f, 0.0f, 100.0f, 150.0f, 100.0f, 200.0f); 53325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy path.cubicTo(100.0f, 200.0f, 50.0f, 300.0f, -80.0f, 200.0f); 54325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy path.cubicTo(-80.0f, 200.0f, 100.0f, 200.0f, 200.0f, 0.0f); 55325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 56325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 579777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private Path makeStraightPath() { 589777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy Path path = new Path(); 599777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy buildStraightPath(path); 609777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy return path; 619777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy } 629777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy 639777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private void buildStraightPath(Path path) { 649777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy path.moveTo(0.0f, 0.0f); 659777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy path.lineTo(400.0f, 0.0f); 669777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy } 679777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy 68325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy public class TextOnPathView extends View { 69325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy private static final String TEST_STRING = "Hello OpenGL renderer, text on path! "; 70325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 71325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy private final Paint mPaint; 729777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private final Paint mPathPaint; 73325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy private final String mText; 749777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private final PathMeasure mMeasure; 759777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private final float mLength; 769777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private final float[] mLines; 779777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private final float[] mPos; 789777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy private final float[] mTan; 79325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 80325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy public TextOnPathView(Context c) { 81325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy super(c); 82325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 83325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy mPaint = new Paint(); 84325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy mPaint.setAntiAlias(true); 85325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy mPaint.setColor(0xff000000); 86325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 879777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mPathPaint = new Paint(); 889777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mPathPaint.setAntiAlias(true); 899777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mPathPaint.setStyle(Paint.Style.STROKE); 909777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mPathPaint.setColor(0xff000099); 919777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy 9203d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy StringBuilder builder = new StringBuilder(TEST_STRING.length() * 2); 9303d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy for (int i = 0; i < 2; i++) { 94325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy builder.append(TEST_STRING); 95325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 96325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy mText = builder.toString(); 979777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy 989777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mMeasure = new PathMeasure(mPath, false); 999777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mLength = mMeasure.getLength(); 1009777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy 1019777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mLines = new float[100 * 4]; 1029777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mPos = new float[2]; 1039777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mTan = new float[2]; 104325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 105325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 106325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy @Override 107325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy protected void onDraw(Canvas canvas) { 108325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy super.onDraw(canvas); 109325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 110325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy canvas.drawARGB(255, 255, 255, 255); 111325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 11203d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.save(); 11303d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.translate(400.0f, 350.0f); 11403d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy mPaint.setTextAlign(Paint.Align.LEFT); 11503d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.drawTextOnPath(mText + mText, mPath, 0.0f, 0.0f, mPaint); 1169777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawPath(mPath, mPathPaint); 1179777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy 1189777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy for (int i = 0; i < 100; i++) { 1199777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mMeasure.getPosTan(i * mLength / 100.0f, mPos, mTan); 1209777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mLines[i * 4 ] = mPos[0]; 1219777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mLines[i * 4 + 1] = mPos[1]; 1229777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mLines[i * 4 + 2] = mPos[0] + mTan[1] * 15; 1239777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mLines[i * 4 + 3] = mPos[1] - mTan[0] * 15; 1249777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy } 1259777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawLines(mLines, mPathPaint); 1269777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy 1279777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.translate(200.0f, 0.0f); 1289777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawTextOnPath(mText + mText, mStraightPath, 0.0f, 0.0f, mPaint); 1299777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawPath(mStraightPath, mPathPaint); 1309777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy 13103d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.restore(); 13203d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy 13303d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.save(); 13403d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.translate(150.0f, 60.0f); 1359777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawTextOnPath(mText, mPath, 0.0f, 10.0f, mPaint); 1369777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mMeasure.getPosTan(5.0f, mPos, mTan); 1379777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawLine(mPos[0], mPos[1], mPos[0] + mTan[1] * 10, mPos[1] - mTan[0] * 10, 1389777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy mPathPaint); 1399777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawPath(mPath, mPathPaint); 14003d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy 14103d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.translate(250.0f, 0.0f); 14203d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy mPaint.setTextAlign(Paint.Align.CENTER); 14303d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint); 1449777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawPath(mPath, mPathPaint); 14503d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy 14603d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.translate(250.0f, 0.0f); 14703d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy mPaint.setTextAlign(Paint.Align.RIGHT); 148325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint); 1499777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy canvas.drawPath(mPath, mPathPaint); 15003d58520c3eb6bb7efb7235bfd957550533d6725Romain Guy canvas.restore(); 151325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 152325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 153325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 154