152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/*
252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * you may not use this file except in compliance with the License.
652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * You may obtain a copy of the License at
752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
1052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * See the License for the specific language governing permissions and
1452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * limitations under the License.
1552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */
1652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpackage com.example.android.apis.graphics;
1852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.content.Context;
2052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.*;
2152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.os.Bundle;
2252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.view.*;
2352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpublic class TextAlign extends GraphicsActivity {
2552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    @Override
2752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
2852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        super.onCreate(savedInstanceState);
2952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        setContentView(new SampleView(this));
3052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
3162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
3252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    private static class SampleView extends View {
3352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private Paint   mPaint;
3452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private float   mX;
3552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private float[] mPos;
3662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
3752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private Path    mPath;
3852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private Paint   mPathPaint;
3962e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
4052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final int DY = 30;
4152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final String TEXT_L = "Left";
4252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final String TEXT_C = "Center";
4352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final String TEXT_R = "Right";
4452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final String POSTEXT = "Positioned";
4552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final String TEXTONPATH = "Along a path";
4662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
4752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static void makePath(Path p) {
4852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.moveTo(10, 0);
4952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.cubicTo(100, -50, 200, 50, 300, 0);
5052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
5162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
5252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private float[] buildTextPositions(String text, float y, Paint paint) {
5352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            float[] widths = new float[text.length()];
5452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // initially get the widths for each char
5552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            int n = paint.getTextWidths(text, widths);
5652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // now popuplate the array, interleaving spaces for the Y values
5752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            float[] pos = new float[n * 2];
5852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            float accumulatedX = 0;
5952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            for (int i = 0; i < n; i++) {
6052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                pos[i*2 + 0] = accumulatedX;
6152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                pos[i*2 + 1] = y;
6252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                accumulatedX += widths[i];
6352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            }
6452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            return pos;
6552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
6662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
6752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        public SampleView(Context context) {
6852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            super(context);
6952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            setFocusable(true);
7062e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
7152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPaint = new Paint();
7252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPaint.setAntiAlias(true);
7352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPaint.setTextSize(30);
7452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPaint.setTypeface(Typeface.SERIF);
7562e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
7652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPos = buildTextPositions(POSTEXT, 0, mPaint);
7762e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
7852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPath = new Path();
7952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            makePath(mPath);
8052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
8152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPathPaint = new Paint();
8252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPathPaint.setAntiAlias(true);
8352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPathPaint.setColor(0x800000FF);
8452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mPathPaint.setStyle(Paint.Style.STROKE);
8552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
8662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
8752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        @Override protected void onDraw(Canvas canvas) {
8852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawColor(Color.WHITE);
8952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
9052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            Paint p = mPaint;
9152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            float x = mX;
9252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            float y = 0;
9352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            float[] pos = mPos;
9462e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
9552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // draw the normal strings
9652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
9752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setColor(0x80FF0000);
9852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawLine(x, y, x, y+DY*3, p);
9952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setColor(Color.BLACK);
10062e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
10152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(0, DY);
10252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.LEFT);
10352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawText(TEXT_L, x, y, p);
10452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
10552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(0, DY);
10652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.CENTER);
10752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawText(TEXT_C, x, y, p);
10852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
10952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(0, DY);
11052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.RIGHT);
11152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawText(TEXT_R, x, y, p);
11262e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
11352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(100, DY*2);
11452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
11552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // now draw the positioned strings
11662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
11752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setColor(0xBB00FF00);
11852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            for (int i = 0; i < pos.length/2; i++) {
11952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                canvas.drawLine(pos[i*2+0], pos[i*2+1]-DY,
12052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                pos[i*2+0], pos[i*2+1]+DY*2, p);
12152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            }
12252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setColor(Color.BLACK);
12352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
12452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.LEFT);
12552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawPosText(POSTEXT, pos, p);
12662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
12752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(0, DY);
12852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.CENTER);
12952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawPosText(POSTEXT, pos, p);
13062e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
13152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(0, DY);
13252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.RIGHT);
13352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawPosText(POSTEXT, pos, p);
13462e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
13552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // now draw the text on path
13662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
13752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(-100, DY*2);
13852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
13952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawPath(mPath, mPathPaint);
14052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.LEFT);
14152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p);
14252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
14352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(0, DY*1.5f);
14452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawPath(mPath, mPathPaint);
14552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.CENTER);
14652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p);
14762e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
14852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(0, DY*1.5f);
14952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawPath(mPath, mPathPaint);
15052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            p.setTextAlign(Paint.Align.RIGHT);
15152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p);
15252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
15352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
15452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        @Override
15552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        protected void onSizeChanged(int w, int h, int ow, int oh) {
15652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            super.onSizeChanged(w, h, ow, oh);
15752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mX = w * 0.5f;  // remember the center of the screen
15852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
15952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
16052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project}
16152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
162