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