15b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy/* 25b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * Copyright (C) 2010 The Android Open Source Project 35b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * 45b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 55b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * you may not use this file except in compliance with the License. 65b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * You may obtain a copy of the License at 75b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * 85b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 95b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * 105b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * Unless required by applicable law or agreed to in writing, software 115b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 125b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * See the License for the specific language governing permissions and 145b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy * limitations under the License. 155b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy */ 165b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 175b4628aeeaa0462cd99256d28b636c06b1845930Romain Guypackage com.android.test.hwui; 185b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 195b4628aeeaa0462cd99256d28b636c06b1845930Romain Guyimport android.animation.ObjectAnimator; 205b4628aeeaa0462cd99256d28b636c06b1845930Romain Guyimport android.app.Activity; 215b4628aeeaa0462cd99256d28b636c06b1845930Romain Guyimport android.content.Context; 225b4628aeeaa0462cd99256d28b636c06b1845930Romain Guyimport android.graphics.Canvas; 235b4628aeeaa0462cd99256d28b636c06b1845930Romain Guyimport android.graphics.Paint; 24e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyimport android.graphics.Path; 255b4628aeeaa0462cd99256d28b636c06b1845930Romain Guyimport android.os.Bundle; 265b4628aeeaa0462cd99256d28b636c06b1845930Romain Guyimport android.view.View; 275b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 285b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy@SuppressWarnings({"UnusedDeclaration"}) 295b4628aeeaa0462cd99256d28b636c06b1845930Romain Guypublic class ScaledTextActivity extends Activity { 305b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 315b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy @Override 325b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy protected void onCreate(Bundle savedInstanceState) { 335b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy super.onCreate(savedInstanceState); 345b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 355b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy final ScaledTextView view = new ScaledTextView(this); 365b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy setContentView(view); 375b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 385b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy ObjectAnimator animation = ObjectAnimator.ofFloat(view, "textScale", 1.0f, 10.0f); 395b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy animation.setDuration(3000); 405b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy animation.setRepeatCount(ObjectAnimator.INFINITE); 415b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy animation.setRepeatMode(ObjectAnimator.REVERSE); 425b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy animation.start(); 435b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 445b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy } 455b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 465b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy public static class ScaledTextView extends View { 47e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy private static final String TEXT = "Hello libhwui! "; 48e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 495b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy private final Paint mPaint; 50e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy private final Paint mShadowPaint; 51e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy private final Path mPath; 52e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 535b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy private float mScale = 1.0f; 545b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 555b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy public ScaledTextView(Context c) { 565b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy super(c); 57c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy setLayerType(LAYER_TYPE_HARDWARE, null); 585b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 59e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy mPath = makePath(); 60e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 615b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy mPaint = new Paint(); 625b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy mPaint.setAntiAlias(true); 635b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy mPaint.setTextSize(20.0f); 64e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 65e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy mShadowPaint = new Paint(); 66e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy mShadowPaint.setAntiAlias(true); 67e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy mShadowPaint.setShadowLayer(3.0f, 0.0f, 3.0f, 0xff000000); 68e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy mShadowPaint.setTextSize(20.0f); 695b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy } 705b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 715b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy public float getTextScale() { 725b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy return mScale; 735b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy } 745b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 755b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy public void setTextScale(float scale) { 765b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy mScale = scale; 775b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy invalidate(); 785b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy } 795b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 80e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy private static Path makePath() { 81e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy Path path = new Path(); 82e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy buildPath(path); 83e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return path; 84e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy } 85e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 86e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy private static void buildPath(Path path) { 87e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy path.moveTo(0.0f, 0.0f); 88e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy path.cubicTo(0.0f, 0.0f, 100.0f, 150.0f, 100.0f, 200.0f); 89e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy path.cubicTo(100.0f, 200.0f, 50.0f, 300.0f, -80.0f, 200.0f); 90e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy path.cubicTo(-80.0f, 200.0f, 100.0f, 200.0f, 200.0f, 0.0f); 91e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy } 92e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 935b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy @Override 945b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy protected void onDraw(Canvas canvas) { 955b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy super.onDraw(canvas); 965b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy 97e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.drawText(TEXT, 30.0f, 30.0f, mPaint); 98c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy mPaint.setTextAlign(Paint.Align.CENTER); 99c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.drawText(TEXT, 30.0f, 50.0f, mPaint); 100c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy mPaint.setTextAlign(Paint.Align.RIGHT); 101c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.drawText(TEXT, 30.0f, 70.0f, mPaint); 102e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 103c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.save(); 104c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.translate(400.0f, 0.0f); 105c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.scale(3.0f, 3.0f); 106c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy mPaint.setTextAlign(Paint.Align.LEFT); 107c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy mPaint.setStrikeThruText(true); 108c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.drawText(TEXT, 30.0f, 30.0f, mPaint); 109c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy mPaint.setStrikeThruText(false); 110c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy mPaint.setTextAlign(Paint.Align.CENTER); 111c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.drawText(TEXT, 30.0f, 50.0f, mPaint); 112c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy mPaint.setTextAlign(Paint.Align.RIGHT); 113c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.drawText(TEXT, 30.0f, 70.0f, mPaint); 114c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.restore(); 115c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy 116c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy mPaint.setTextAlign(Paint.Align.LEFT); 117c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy canvas.translate(0.0f, 100.0f); 118e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 1195b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy canvas.save(); 1205b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy canvas.scale(mScale, mScale); 121e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.drawText(TEXT, 30.0f, 30.0f, mPaint); 1225b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy canvas.restore(); 123e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 124e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.translate(0.0f, 250.0f); 125e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.save(); 126e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.scale(3.0f, 3.0f); 127e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.drawText(TEXT, 30.0f, 30.0f, mShadowPaint); 128e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.translate(100.0f, 0.0f); 129e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy// canvas.drawTextOnPath(TEXT + TEXT + TEXT, mPath, 0.0f, 0.0f, mPaint); 130e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.restore(); 131e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 132e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float width = mPaint.measureText(TEXT); 133e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 134e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.translate(500.0f, 0.0f); 135e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.rotate(45.0f, width * 3.0f / 2.0f, 0.0f); 136e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.scale(3.0f, 3.0f); 137e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy canvas.drawText(TEXT, 30.0f, 30.0f, mPaint); 1385b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy } 1395b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy } 1405b4628aeeaa0462cd99256d28b636c06b1845930Romain Guy} 141